我正在尝试在 SICP 中做练习 2.78,但 put 和 get 的功能是未知的。我尝试了多种语言,例如相当大、球拍、r5rs、mit-scheme、mzscheme 等。我什至下载了 SICP 支持 (http://www.neilvandyke.org/sicp-plt/),但无济于事。我怎样才能让这些功能发挥作用?
问问题
3487 次
5 回答
20
是的,我发现 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))
从本书后面的角度来看,这可能是一个幼稚的实现,但相当简单并且运行良好。
于 2011-03-31T11:42:27.363 回答
10
Eli Bendersky有一个put和get的实现。这些功能可以使用内置的基本哈希表操作来实现。这是我修改后的 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))
于 2013-10-01T10:36:46.003 回答
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) '()))
于 2016-04-24T14:19:59.480 回答
2
在 的小节Creating local tables
中3.3.3 Representing Tables
,有一个实现。
于 2013-08-31T08:53:05.807 回答
2
mit-scheme 有一个可以使用的内置全局表。
http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/The-Association-Table.html
简单地定义 get 和 put 到:
(define get 2d-get)
(define put 2d-put!)
于 2015-04-06T04:44:55.640 回答