Подтвердить что ты не робот

Как я могу получить функции, которые входят в SICP, Scheme, Exercise 2.78 и on

Я пытаюсь выполнить упражнение 2,78 в SICP, но функции put и get неизвестны. Я пробовал несколько языков, таких как довольно большой, ракетка, r5rs, мит-схема, mzscheme и т.д. Я даже загрузил поддержку SICP (http://www.neilvandyke.org/sicp-plt/), но безуспешно. Как я могу заставить эти функции работать?

4b9b3361

Ответ 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 существует реализация.