我试图在SICP中进行2.78运动,但是函数put和get是未知的.我尝试了多种语言,如相当大,球拍,r5rs,mit-scheme,mzscheme等.我甚至下载了SICP支持(http://www.neilvandyke.org/sicp-plt/),但无济于事.我怎样才能使这些功能起作用?
dry*_*dam 19
是的,我发现SICP有时会因为这样的东西而烦人.假定存在但实际上不存在的函数使得尝试这些示例变得更加困难.我自己编写了(get)和(put)(这是在GNU guile中):
(define global-array '())
(define (make-entry k v) (list k v))
(define (key entry) (car entry))
(define (value entry) (cadr entry))
(define (put op type item)
(define (put-helper k array)
(cond ((null? array) (list(make-entry k item)))
((equal? (key (car array)) k) array)
(else (cons (car array) (put-helper k (cdr array))))))
(set! global-array (put-helper (list op type) global-array)))
(define (get op type)
(define (get-helper k array)
(cond ((null? array) #f)
((equal? (key (car array)) k) (value (car array)))
(else (get-helper k (cdr array)))))
(get-helper (list op type) global-array))
Run Code Online (Sandbox Code Playgroud)
从本书后面的角度来看,可能是一个天真的实现,但相当简单,工作得很好.
还有的实现看跌并获得由礼Bendersky.可以使用内置的基本哈希表操作来实现这些功能.以下是我修改后的Eli代码版本,可与MIT-Scheme Release 9.1.1一起正常使用.
(define *op-table* (make-hash-table))
(define (put op type proc)
(hash-table/put! *op-table* (list op type) proc))
(define (get op type)
(hash-table/get *op-table* (list op type) '()))
Run Code Online (Sandbox Code Playgroud)
更新:
我已经发现了上面提到的代码的错误.空列表true在Scheme 中被解释为条件子句,因此正确的get实现应该如下:
(define (get op type)
(hash-table/get *op-table* (list op type) #f))
Run Code Online (Sandbox Code Playgroud)
小智 6
如果您使用 Racket 编程语言,请使用这些:
(define *op-table* (make-hash))
(define (put op type proc)
(hash-set! *op-table* (list op type) proc))
(define (get op type)
(hash-ref *op-table* (list op type) '()))
Run Code Online (Sandbox Code Playgroud)