2011-03-31 6 views

Respuesta

17

Sí, encontré el SICP un poco molesto a veces por cosas como esta. Las funciones que se supone que existen pero que en realidad no existen dificultan el intento de los ejemplos. Escribí mi propia (obtener) y (poner) de esta manera (esto fue por engaño 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)) 

Probablemente una aplicación ingenua desde la perspectiva de la tarde en el libro, pero bastante simple y funcionó bien.

0

En la subsección Creating local tables de 3.3.3 Representing Tables, hay una implementación.

6

Existe una implementación de poner y obtener por Eli Bendersky. Estas funciones podrían implementarse usando el built-in Basic Hash Table Operations. Aquí está mi versión modificada del código de Eli para que funcione correctamente con MIT-Scheme versión 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) '())) 

ACTUALIZADO:

he encontrado error con el código de referencia por tiempo. listas vacías se interpretan como true en las cláusulas condicionales en el Esquema, tan correcto get aplicación debe ser la siguiente:

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

Si utiliza lenguaje de programación de la raqueta por favor utilice los siguientes:

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