Схема - Система памяти - PullRequest
       5

Схема - Система памяти

1 голос
/ 15 января 2010

Я пытаюсь создать систему памяти, в которую вы вводите что-то в ячейку памяти.Итак, я делаю Alist, а машина пар - это ячейка памяти, а cdr - это val.Мне нужна программа, чтобы понять два сообщения: чтение и запись.Чтение просто отображает выбранную ячейку памяти и значение val, назначенное этому расположению, и запись изменяет значение val местоположения или адресаКак мне сделать свой код таким образом, чтобы он читал место, куда вы хотите, и записываете в то место, куда вы хотите?Не стесняйтесь проверить это самостоятельно.Любая помощь приветствуется.Вот что у меня есть:

(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))

1 Ответ

2 голосов
/ 04 февраля 2010

Возможное решение:

(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)])))

Это имеет дополнительное преимущество: не использовать списки (для скорости) и защищать от злонамеренных попыток получить доступ к материалам за пределами предварительно выделенного диапазона;) Работает как нужно:

> (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

Это может быть немного трудно понять, если вы только начинаете со Схемы. Вы можете узнать больше о match-lambda и друзьях здесь . Векторы являются эквивалентными схемами массивов на других языках ( прочитайте это ).

...