2011-03-31 87 views
12

我試圖做2.65在SICP,但功能放和得到是未知的。我已經嘗試過多種語言,比如相當大,球拍,r5rs,mit-scheme,mzscheme等。我甚至下載了SICP支持(http://www.neilvandyke.org/sicp-plt/),但都無濟於事。我如何獲得這些功能?我如何獲得功能放在SICP,計劃,練習2.78和

回答

17

是的,我發現SICP有時會因爲這樣的東西而有點煩人。假設存在但實際上並不存在的函數使得嘗試這些示例更加困難。我寫我自己的(得)和(放)像這樣(這是在GNU詭詐):

(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)) 

大概從後來在書中的觀點天真的實現,但相當簡單,工作得很好。

0

3.3.3 Representing TablesCreating local tables小節中,有一個實現。

6

有一個執行得到通過Eli Bendersky。 這些功能可以使用內置的Basic Hash Table Operations來實現。這是我修改後的Eli代碼版本,可以與MIT-Scheme版本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) '())) 

修訂

我發現臭蟲以時間後上述代碼。空列表由計劃解釋爲true在有條件的條款,從而正確get實施應如下:

(define (get op type) 
    (hash-table/get *op-table* (list op type) #f)) 
4

如果使用球拍的編程語言,請使用這些:

(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) '()))