1

私は、Scheme で引用現象がどのように機能するかを理解しようとしています。特に、引用された用語の自由変数がいつバインドされるかを理解したいと思います。

たとえば、私が書くとき

(define q 'a)
(define a 42)
(eval q)

42 を返します。したがって、バインド時間は実行時であると推測します。しかし、この場合、なぜこのコードは失敗するのでしょうか

(let ((q 'a))
  (let ((a 42))
    (eval q)
  )
)

そして戻る

unbound variable:  a

引用された用語の結合時間モデルとは何か(たとえば、MetaOCaml に匹敵しますか?(私はそうは思いません))、define と let の違いを説明してもらえますか?

4

2 に答える 2

2

スキームには、動的バインディングの規律ではなく、レキシカル スコープの規律があります。

トップレベルのdefine定義は、トップレベルの字句環境でバインディングを作成するかのように動作します。

2 番目のコード スニペットは、実際には 2 つのレキシカル環境を作成し、一方が他方の内部にネストされています。したがって、どこ ( 「いつ」ではない)qはバインドされaていますが、まだバインドされていません。しかし、本当の問題は、どの環境が によって使用されるevalかということです。

あなたの実装は、変数の値であるシンボル を評価するために、定義環境またはトップレベル環境を使用しているかのように動作しますが、現在のレキシカル環境を使用していないことは確かです。変数には、その形式によって作成された明確な結合字句環境がありますが、シンボルの結合はどこにあるのでしょうか? どうすれば知ることができますか?'aq qlet 'a

詳細はドキュメントにあるはずです。

于 2016-05-03T17:35:21.970 に答える