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

Kno*_*tle 13 scheme sicp

我试图在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)

从本书后面的角度来看,可能是一个天真的实现,但相当简单,工作得很好.


max*_*lis 7

还有的实现看跌获得礼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)