He estado leyendo a través de SICP (Estructura e Interpración de Programas de Computadora) y estaba realmente emocionado de descubrir esta maravillosa forma especial: "make-environment", que demuestran usar en combinación con eval como una forma de escribir código modular (extracto de la sección 4.3 en "paquetes"):¿Por qué Scheme no admite entornos de primera clase?
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
a continuación demuestran cómo funciona con
((eval 'square-root scientific-library) 4)
en su ejemplo, y luego ir a demostrar exactamente el uso que lo haría querer - una manera elegante, minimalista o f haciendo el estilo "OO" en el esquema ... Ellos "contras" juntos un "tipo", que en realidad es lo que fue devuelto por la forma especial "hacer entorno" (es decir, la viable), y un arg ("Estado") ...
Estaba tan emocionado porque esto es exactamente lo que he estado buscando como una manera de hacer el envío polimórfica "por el símbolo" en el Esquema sin tener que escribir muchos códigos explícitos o macros.
Es decir, quiero crear un "objeto" que tenga, digamos, dos funciones, que llamo en diferentes contextos ... pero no quiero referirme a ellas por "coche" y "cdr" , Quiero tanto declarar y evaluar por sus nombres simbólicos.
De todos modos, cuando leí esto, no podía esperar para llegar a casa y probarlo.
imaginar mi decepción entonces cuando experimenté lo siguiente en tanto PLT Scheme y Chez Esquema:
> (make-environment (define x 3))
Error: invalid context for definition (define x 3).
> (make-environment)
Error: variable make-environment is not bound.
¿Qué le pasó a "hacer-medio ambiente" como se indica en SICP? Todo parecía tan elegante, y exactamente lo que quiero, sin embargo, no parece ser compatible con ningún intérprete moderno de Scheme.
¿Cuál es el motivo? ¿Es simplemente que "make-environment" tiene un nombre diferente?
Más información encontrado más tarde
que tomé en vistazo a la versión en línea:
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-28.html#%_sec_4.3
que estaba leyendo era la primera edición de SICP. La segunda edición parece haber reemplazado la discusión sobre paquetes con una sección sobre programación no determinista y el operador "amp".
El macro make-environment es genial, pero todavía echo de menos una cosa: me gustaría tener una forma de * verificar * si un símbolo está enlazado en un entorno, usando solo R5RS estándar, y hasta donde yo sé, esto no es posible sin feos hacks como almacenar una tabla de nombres definidos, etc.) – Jay
Hm, acabo de notar que el truco de make-environment puede o no funcionar en una implementación de Scheme: scheme-report-environment * may * puede ser inmutable, y también, el LET dentro de la macro puede no copiar el entorno. No parece haber una forma portátil de crear un entorno en Scheme (al menos no en R5RS). – Jay