Я пытаюсь выполнить упражнение 2,78 в SICP, но функции put и get неизвестны. Я пробовал несколько языков, таких как довольно большой, ракетка, r5rs, мит-схема, mzscheme и т.д. Я даже загрузил поддержку SICP (http://www.neilvandyke.org/sicp-plt/), но безуспешно. Как я могу заставить эти функции работать?
Как я могу получить функции, которые входят в SICP, Scheme, Exercise 2.78 и on
Ответ 1
Да, я обнаружил, что SICP немного раздражает из-за таких вещей. Предполагается, что функции, которые существуют, но фактически не существуют, затрудняют попытки использовать примеры. Я написал свои собственные (получить) и (поместил) так (это было в 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))
Вероятно, наивная реализация с точки зрения позже в книге, но довольно простая и хорошо работающая.
Ответ 2
Существует реализация put и get Eli 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) '()))
ОБНОВЛЕНО
Я нашел ошибку с вышеупомянутым кодом после времени. Пустые списки интерпретируются как true
в условных предложениях Схемой, поэтому правильная реализация get
должна быть следующей:
(define (get op type)
(hash-table/get *op-table* (list op type) #f))
Ответ 3
Если вы используете язык программирования 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) '()))
Ответ 4
В подразделе Creating local tables
of 3.3.3 Representing Tables
существует реализация.
Ответ 5
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!)