我试图在SICP中练习2.78但是函数put和get是未知的。我尝试了多种语言,如相当大,球拍,r5rs,mit-scheme,mzscheme等。我甚至下载了SICP支持(http://www.neilvandyke.org/sicp-plt/),但无济于事。我怎样才能使这些功能起作用?
答案 0 :(得分: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))
从本书后面的角度来看,可能是一个天真的实现,但相当简单,工作得很好。
答案 1 :(得分:6)
Eli Bendersky实现了 put 和 get 。 可以使用内置Basic Hash Table Operations来实现这些功能。以下是我修改后的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) '()))
<强>已更新强>:
我已经发现了上述代码的错误。在Scheme的条件子句中,空列表被解释为true
,因此应该遵循正确的get
实现:
(define (get op type)
(hash-table/get *op-table* (list op type) #f))
答案 2 :(得分:4)
如果您使用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) '()))
答案 3 :(得分:1)
在Creating local tables
的{{1}}小节中,有一个实现。
答案 4 :(得分:0)
mit-scheme有一个可以使用的内置全局表。
http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/The-Association-Table.html
只需定义get并放入:
(define get 2d-get)
(define put 2d-put!)