Sto leggendo tramite SICP (Struttura e Interprete dei programmi per computer) ed ero davvero entusiasta di scoprire questa meravigliosa forma speciale: "make-environment", che dimostrano di utilizzare in combinazione con eval come un modo di scrivere codice modulare (estratto dalla sezione 4.3 "pacchetti"):Perché Scheme non supporta gli ambienti di prima classe?
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
hanno poi dimostrano come funziona con
((eval 'square-root scientific-library) 4)
Nel loro esempio, hanno poi andare avanti per dimostrare esattamente l'utilizzo che avrei voglio - un modo elegante e minimalista o f facendo lo stile "OO" nello schema ... "Cons" insieme un "tipo", che è in realtà ciò che è stato restituito dal modulo speciale "make-environment" (ad es. vtable), e un ARG ("lo Stato") ...
Ero così eccitata perché questo è esattamente quello che ho cercato come un modo per fare la spedizione polimorfa "dal simbolo" nello Schema senza dover scrivere molto codice esplicito o macro.
ie Voglio creare un "oggetto" che ha, diciamo, due funzioni, che chiamo in contesti diversi ... ma non voglio farvi riferimento da "auto" e "cdr" , Voglio entrambi dichiarare e valutare con il loro nome simbolico.
In ogni caso, quando ho letto questo non vedevo l'ora di tornare a casa e provarlo.
immaginare la mia delusione quando poi ho sperimentato il seguente sia in PLT Scheme e Chez Scheme:
> (make-environment (define x 3))
Error: invalid context for definition (define x 3).
> (make-environment)
Error: variable make-environment is not bound.
Cosa è successo a "make-ambiente", come si fa riferimento in SICP? Sembra tutto così elegante, ed esattamente quello che voglio, eppure non sembra essere supportato da nessun interprete di Scheme moderno?
Qual è la logica? È semplicemente che "make-environment" ha un nome diverso?
Maggiori informazione presente tardi
ho preso al un'occhiata alla versione on-line:
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-28.html#%_sec_4.3
stavo leggendo era la prima edizione di SICP. La seconda edizione sembra aver sostituito la discussione sui pacchetti con una sezione sulla programmazione non deterministica e l'operatore "amp".
La macro make-environment è ottima, ma mi manca ancora una cosa: mi piacerebbe avere un modo per * verificare * se un simbolo è legato in un ambiente, usando solo R5RS standard, e per quanto ne so, questo non è possibile senza brutti hack come memorizzare una tabella di nomi definiti, ecc.) – Jay
Hm, ho appena notato che il trucco make-environment può o non può funzionare su un'implementazione di Scheme: schema-report-environment * may * essere immutabile, e inoltre, il LET all'interno della macro potrebbe non copiare l'ambiente. Non sembra essere un modo portabile per creare un ambiente in Scheme (almeno non in R5RS). – Jay