(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)してもキーワードとしての解釈は変らない
ようだ。