LISP

このエントリーをはてなブックマークに追加
732仕様書無しさん
(define else #t)によって(cond (else ...))を実現している
処理系は規格違反か?
→たぶんno。しかし、そういう処理系だとcaseはどうするの?

(define else #t)は羞恥の事実か?
→冗談でしょ。

(define else #f)すると何が起きるか?
→R5RSにはちゃんと書いてない。

 局所変数は、キーワードをshadowし、キーワードは変数を
 shadowすると書いてある(4.3.2)。

 一方、initial environmentは変更できなくても良いと書いて
 ある(6.5)。また、トップレベルでbuilt-in procedureを再定
 義しても良く、その結果他のbuilt-in procedureの振る舞い
 は変らないとある(6, Notes)。(要するに、built-inをインラ
 イン展開して良いってこと。)

 これを満たすありがちな実装としては、initial environment
 の「子」としてトップレベルの環境(interactive
 environment)があり、トップレベルでbuilt-in procedureと
 同じ名前の変数をdefineするとinitial environmentの変数を
 shadowする、というもの。

 だとすると、トップレベルでdefineするのも局所変数として
 バインドするのも同じで、キーワードとしてのelseはshadow
 されるという解釈がありうる。(hygienic macroのセマンティ
 クスの意図に沿ったすなおな解釈だと思う。)

 しかし、initial environmentが変更できる実装も可能だし、
 だいいちcondやelseはprocedure名でない。6.5やNotesの記述
 が当てはまるかどうかは書いていない。scmやguileでは、
 (define else #f)してもキーワードとしての解釈は変らない
 ようだ。