19

私は 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」演算子に関するセクションに置き換えられたようです。

4

4 に答える 4

5

彼らがそのように書いたのは、実際には MIT スキームが一流の環境を持っているからであり、おそらくそれが、著者がクラスで教えようと計画していたものだからです (この本は MIT で書かれたため)。

http://groups.csail.mit.edu/mac/projects/scheme/をチェックしてください

しかし、MIT スキームはまだ活発に開発されているものの、外部関数インターフェイスや GUI サポートなど、真に最新のスキームにある機能の多くが欠けていることに気付きました。本格的なソフトウェア開発プロジェクトでは、少なくとも単独では使用したくないでしょう。

于 2010-01-11T22:55:40.803 に答える
4

パフォーマンス上の理由から、Scheme には一流の環境がありません。Scheme が作成されたとき、ファーストクラスの関数や継続などの気の利いたもののために、Scheme は最速の言語ではありませんでした。ファーストクラスの環境を追加すると、パフォーマンスがさらに低下します。つまり、Scheme の初期に行われたトレードオフでした。

于 2009-03-06T11:21:08.993 に答える