2010-01-15 5 views
1

J'essaye de faire un système de mémoire où vous entrez quelque chose dans un emplacement de mémoire. Donc ce que je fais est de faire un Alist et la voiture des paires est l'emplacement de la mémoire et le cdr est le val. J'ai besoin du programme pour comprendre deux messages, lire et écrire. Lisez simplement l'affichage de l'emplacement de mémoire sélectionné et le val attribué à cet emplacement et l'écriture change le val de l'emplacement ou de l'adresse. Comment puis-je créer mon code afin qu'il lise l'emplacement souhaité et que j'écrive à l'emplacement souhaité? N'hésitez pas à tester cela vous-même. Toute aide serait très appréciée. Voilà ce que j'ai:Schéma - Système de mémoire

(define make-memory 
    (lambda (n) 
    (letrec ((mem '()) 
      (dump (display mem))) 
     (lambda() 
     (if (= n 0) 
      (cons (cons n 0) mem) mem) 
      (cons (cons (- n 1) 0) mem)) 
     (lambda (msg loc val) 
     (cond 
      ((equal? msg 'read) (display 
           (cons n val))(set! n (- n 1))) 
      ((equal? msg 'write) (set! mem 
            (cons val loc)) (set! n (- n 1)) (display mem))))))) 


(define mymem (make-memory 100)) 
+0

En tant que programmeur C, ce langage est assez différent, mais j'aime vraiment la façon dont cela me fait tourner la tête. –

Répondre

2

Une solution possible:

(define (make-memory n) 
    (let ([memory (make-vector n 0)] 
     [protect (lambda (addr) 
        (if (and (addr . >= . 0) (addr . < . n)) 
        addr 
        (error "access to outside of memory")))]) 
    (match-lambda* 
    [`(read ,addr) (cons addr (vector-ref memory (protect addr)))] 
    [`(write ,addr ,x) (vector-set! memory (protect addr) x)]))) 

Cela a l'avantage de ne pas utiliser alistes (pour la vitesse) et la protection contre les tentatives malveillantes d'accéder à des choses en dehors de la plage préaffecté;). Works comme souhaité:

> (define mem (make-memory 10)) 
> (mem 'read 0) 
(0 . 0) 
> (mem 'read 2) 
(2 . 0) 
> (mem 'write 2 10) 
> (mem 'read 2) 
(2 . 10) 
> (mem 'read 100) 
access to outside of memory 

Cela pourrait être un peu difficile à saisir si vous êtes débutant avec le schéma. Vous pouvez en savoir plus sur match-lambda et amis here. Les vecteurs sont l'équivalent des tableaux dans d'autres langues (read this).

Questions connexes