Я читал SICP (Структура и Интерпретация компьютерных программ) и был действительно взволнован, обнаружив эту замечательную специальную форму: «make-environment», которую они демонстрируют для использования в сочетании с eval как способ написания модульных код (выдержка из раздела 4.3 по «пакетам»):
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
Затем они демонстрируют, как это работает с
((eval 'square-root scientific-library) 4)
В своем примере они затем демонстрируют точно использование, которое я хотел бы - элегантный, минималистский способ выполнения стиля "ОО" в схеме ... Они "объединяют" вместе «type», который фактически является тем, что было возвращено специальной формой «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».