如何在SICP,Scheme,Exercise 2.78等中获取函数

时间:2011-03-31 11:22:05

标签: scheme sicp

我试图在SICP中练习2.78但是函数put和get是未知的。我尝试了多种语言,如相当大,球拍,r5rs,mit-scheme,mzscheme等。我甚至下载了SICP支持(http://www.neilvandyke.org/sicp-plt/),但无济于事。我怎样才能使这些功能起作用?

5 个答案:

答案 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!)