Scheme 方案-存储系统
我正在尝试制作一个内存系统,你可以在内存插槽中输入一些东西。所以我要做的是做一个列表,成对的车是内存位置,cdr是val。我需要这个程序来理解两条消息,读和写。只读显示选定的内存位置和分配给该位置的val,写入更改位置或地址的val。如何使代码读取您希望的位置,并写入您希望的位置?你可以自己测试一下。任何帮助都将不胜感激。这就是我所拥有的:Scheme 方案-存储系统,scheme,racket,Scheme,Racket,我正在尝试制作一个内存系统,你可以在内存插槽中输入一些东西。所以我要做的是做一个列表,成对的车是内存位置,cdr是val。我需要这个程序来理解两条消息,读和写。只读显示选定的内存位置和分配给该位置的val,写入更改位置或地址的val。如何使代码读取您希望的位置,并写入您希望的位置?你可以自己测试一下。任何帮助都将不胜感激。这就是我所拥有的: (define make-memory (lambda (n) (letrec ((mem '()) (dump (d
(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))
一种可能的解决办法:
(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)])))
如果您刚开始使用Scheme,这可能有点难以理解。
您可以阅读有关匹配lambda
和朋友的更多信息。
向量是Scheme在其他语言()中的数组等价物。作为一名C程序员,这种语言非常不同,但我真的很喜欢它让我的大脑扭曲的方式。
> (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