私は SICP (Structure and Interpration of Computer Programs) を読んでいて、モジュラー コードを記述する方法として eval と組み合わせて使用することを示している "make-environment" という素晴らしい特別な形式を発見して本当に興奮しました (抜粋)。 「パッケージ」のセクション 4.3 から):
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
次に、それがどのように機能するかを示します
((eval 'square-root scientific-library) 4)
彼らの例では、私が望む使用法を正確に示しています-スキームで「OO」スタイルを実行するエレガントで最小限の方法です...それらは「タイプ」を「コンス」します。 「make-environment」特殊フォーム (つまり、vtable) と arg (「状態」) によって返されます...
明示的なコードやマクロを大量に書かなくても、Scheme で「シンボルによって」ポリモーフィックなディスパッチを行う方法としてまさに探していたものなので、とても興奮しました。
つまり、たとえば、異なるコンテキストで呼び出す2 つの関数を持つ「オブジェクト」を作成したいのですが、「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.
SICP で参照されている「make-environment」はどうなりましたか? それはすべて非常にエレガントで、まさに私が望んでいるように見えましたが、最新のSchemeインタープリターではサポートされていないようです?
根拠は何ですか?「make-environment」の名前が違うだけですか?
後で見つけた詳細情報
私はオンライン版を見てみました:
http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28.html#%_sec_4.3
私が読んでいたのはSICPの初版でした。第 2 版では、パッケージに関する議論が、非決定論的プログラミングと「amp」演算子に関するセクションに置き換えられたようです。