Я читал через SICP (структура и взаимодействие компьютерных программ) и был очень рад открыть эту замечательную специальную форму: "make-environment", которую они демонстрируют в сочетании с eval как способ написания модульных код (выдержка из раздела 4.3 "Пакеты" ):
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
Затем они демонстрируют, как это работает с
((eval 'square-root scientific-library) 4)
В своем примере они затем продолжают демонстрировать именно то, что я хочу, - элегантный, минималистский способ сделать стиль "OO" в схеме... Они "минуют" вместе "тип", который на самом деле то, что было возвращено специальной формой "make-environment" (т.е. vtable), и arg ( "состояние" )...
Я был так взволнован, потому что это именно то, что я искал, чтобы сделать полиморфную отправку "по символу" в Схеме без необходимости писать много явного кода или макросов.
то есть. Я хочу создать "объект", который имеет, скажем, две функции, которые я вызываю в разных контекстах... но я не хочу ссылаться на них с помощью "car" и "cdr", я хочу как объявить, так и оценивайте их своими символическими именами.
В любом случае, когда я прочитал это, я не мог дождаться, когда вернусь домой и попробую.
Представьте мое разочарование, когда я испытал следующее на схеме PLT и Chez:
> (make-environment (define x 3))
Error: invalid context for definition (define x 3).
> (make-environment)
Error: variable make-environment is not bound.
Что случилось с "make-environment", как указано в SICP? Все это казалось таким изящным, и именно то, что я хочу, но он, кажется, не поддерживается ни в каких современных переводчиках Scheme?
Какое обоснование? Это просто, что "make-environment" имеет другое имя?
Дополнительная информация найдена позже
Я посмотрел онлайн-версию:
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-28.html#%_sec_4.3
Я читал это первое издание SICP. Второе издание, по-видимому, заменило обсуждение пакетов секцией о недетерминированном программировании и операторе "amp".