Schemeのプロシージャ呼び出し補足

Schemeのプロシージャ呼び出し時のプロシージャ及び引数の評価順序についての補足です。

情報科学基礎実験のWebページには、式の評価順序についてイカのように書かれています。

このプログラムをGaucheで実行された方は気づかれたかと思いますが、結果は

second
first
third
10

などと、想定した通りではなく、順序がめちゃくちゃになったかと思います。

実は、上記の説明は誤りです。イカにRevised^5 Report on the Algorithmic Language Scheme 4.1.3 Procedure callsの文章を引用します。

これの日本語訳を「プログラミング言語SCHEME」(ピアソンエデュケーションジャパン)より引用します。

つまり、プロシージャとその引数の評価順序は規定されていないのです。

これを上の例に当てはめますと、

(apply-and-add square 1):プロシージャ
(begin (display "second\n") 3):引数

でありますから、これらはどちらが先に実行されてもよいのです。

先程の例では、たまたまGaucheが引数を先に評価したため、secondが先に表示されたわけです。これをGuileで実行すると、プロシージャが先に評価されて、firstが先に表示されます。

このように評価の順序は処理系に依存しますし、また、プロシージャ呼び出しごとに異なってもよいとされていますので、同じ処理系で同じプロシージャを呼び出しても順序が違うということも起こり得ます。(※実際にGaucheやGuileでどのように実装されているかは知らないので詳しい方にパス。)

したがって、プロシージャを呼び出す際には、評価順序に依存するようなプログラムを書かないようにしましょう。順序を指定したい場合はbegin形式を使用してください。


Category読み物

carbon_twelve/Schemeのプロシージャ呼び出し補足 (最終更新日時 2011-01-12 23:40:15 更新者 carbon_twelve)