首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方案-存储系统

方案-存储系统
EN

Stack Overflow用户
提问于 2010-01-15 13:00:36
回答 1查看 211关注 0票数 1

我正在尝试制作一个记忆系统,在这个系统中,你可以在一个内存插槽中输入一些东西。所以我要做的是做一个列表,对中的car是内存位置,cdr是val。我需要程序理解两个消息,读和写。读取只是显示所选的内存位置,分配给该位置的val和write会更改该位置或地址的val。如何让我的代码读到你想要的位置,并写到你想要的位置?你可以自己测试一下。任何帮助都将不胜感激。这就是我所拥有的:

代码语言:javascript
运行
复制
(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))
EN

回答 1

Stack Overflow用户

发布于 2010-02-04 21:17:47

一种可能的解决方案:

代码语言:javascript
运行
复制
(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 (为了速度),并防止恶意尝试访问预先分配的范围之外的内容;)。按预期工作:

代码语言:javascript
运行
复制
> (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)中对数组的等价物。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2069618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档