我正在尝试制作一个记忆系统,在这个系统中,你可以在一个内存插槽中输入一些东西。所以我要做的是做一个列表,对中的car是内存位置,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))
发布于 2010-02-04 21:17:47
一种可能的解决方案:
(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)])))
这有一个额外的好处,即不使用and (为了速度),并防止恶意尝试访问预先分配的范围之外的内容;)。按预期工作:
> (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
和朋友here的内容。向量是Scheme在其他语言(read this)中对数组的等价物。
https://stackoverflow.com/questions/2069618
复制相似问题