toplevel define

昨日の話題の続き。

# shiro 『その疑問は正しい。toplevel defineはSchemeのダークコーナーなのです。R5RSの7.2節のformal semanticsでは敢えて触れられていません (「処理系が都合の良いセマンティクスを選べる」ということです)。

なお、defineの第2引数の「値」が定義される前に求まっていなけばならない、というのはSchemeがapplicative orderだから、と考えたらどうでしょう。』 (2006/01/14 17:23)

ふむ。まあ言ってしまえば「applicative order だから」という事になりますかね。一旦そう書いて消したんですけどね、define は構文であって評価戦略は関係ないはずですから。
理想はあくまでλ算法で使う定義のようなもの -- これには前後とか同時性の概念は存在しない -- なのだけれど programming 言語の使命としてはそれを reasonable な cost で「解く」事が課されるから、「評価」という実装手法を導入した。この時点で循環参照の解決の実装を放棄している。さらに Scheme では「評価」の実装戦略に適用順序を採用したので、前方参照も放棄した (lambda か delay に頼って解決するようにした)。define だけ全部 lazy というのもおかしいし。
という事で、違う視点から述べてるだけかと思います。
↑に後方参照を放棄するか否かという話を付け足すと toplevel define と letrec* の話になりますねぇ。私には toplevel define が後方参照を許しているのは利便性のための妥協にしか見えないので (順序という概念を持ち出すのは変態だから)、internal define をそっちに合わせるのは本末転倒だと思います。それで toplevel define を internal define に合わせるために module を toplevel の上に置いてそこから上は美しさを求めないという話を出したわけで。

それとも違うことが言いたかったんだろうか。