1

我正在尝试制作一个内存系统,您可以在其中输入一些内容到内存槽中。所以我正在做的是制作一个 Alist,而这对汽车是内存位置,而 cdr 是 val。我需要程序来理解两条消息,读取和写入。只读显示选定的内存位置以及分配给该位置的 val 和 write 更改位置或地址的 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))
4

1 回答 1

2

一个可能的解决方案:

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

这样做的额外好处是不使用 alist(为了速度)并防止恶意尝试访问预分配范围之外的内容;)。按需要工作:

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

如果您刚开始使用 Scheme,这可能有点难以理解。你可以在这里阅读更多关于match-lambda和朋友的信息。向量是 Scheme 中其他语言中数组的等价物(请阅读此处)。

于 2010-02-04T13:17:46.873 回答