コンピュータプログラムの構造と解釈の演習を通して、私はゆっくりと自分の道を進んできました。セクション1.1.5では、適用評価と通常順序評価について説明し、その後、このトピックがテキストで何度か取り上げられています。インタープリターは適用順序評価を使用するためdisplay
、コードにデバッグステートメントを挿入するだけで、それがどのように機能するかを正確に確認できます。通常の順序の評価でも同じことができると理解するのに役立ちます。
適用順序ではなく通常順序評価を使用して実装されたScheme(またはLisp)インタープリターを知っている人はいますか?
アップデート:
これは、SICPで提供されているものから変更された短い例です。add
引数を出力するための独自のプロシージャを定義square
し、本のプロシージャを使用します。
(define (add x y)
(display x)
(display y)
(newline)
(+ x y))
(define (square x) (* x x))
(square (add 1 2))
ここで、適用順序評価を使用して短いプログラムを実行すると、の結果は1回だけ計算され、その後プロシージャ(add 1 2)
に渡されます。square
オペランド12
は、最終結果の前に1回出力する必要があります。これをインタプリタで実行して、これが発生することを確認できます。
> (square (add 1 2))
12
9
ただし、通常の順序の評価を使用すると、単一のオペランドをプロシージャに(add 1 2)
コピーする必要があります。これは、として評価されます。オペランドは、最終結果の前に2回出力する必要があります。square
(* (add 1 2) (add 1 2))
12
これを通常の順序の評価を行うインタープリターで実行して、これが実際にどのように機能するかを確認できるようにしたいと思います。