>>433
ちょっと説明を整理してみた。
>(set! hoge (lambda (x) (if x "foo" "bar"))) (hoge #t) (set! if list) (hoge #t)
>いけないっていうのは良く分かりませんが
最初に、トップレベルでは(set! if list)はできない。
これはトップレベルのifが変数でないことを意味する。
次に、(define if list) (if 1 2 3) -> (1 2 3)
これは新しい変数ifを作りlistを束縛して呼び出し、結果の(1 2 3)を得ている。
では(define if list)の前に使われたifをどうするか?
そこではifは変数ではないので値を書き換える事はできない。
これが
(define (hoge x) (if x "foo" "bar")) (hoge #t) (define if list) (hoge #t)
でhogeが両方"foo"を返さなければならない理由。

>(define (hoge x y) (cons x y)) (hoge 3 4) (define cons list) (hoge 3 4)
>の結果は処理系によってまちまちです。
これは主なトップレベルの実装方法に2種類あるためで、明確な規定が無い為どっちが正しいとも間違いとも決められない現状ではしかたのないことではなかろうか。
ちなみに最初の方法は、
*すべてのシンボルが<undefined>という特別な状態に束縛されているとする。
*defineをset!として解釈する。
これは5.2.1 Top level definitionsに"Some implementations ..."と書いてある方法だ。
これによれば、次の様に解釈する
(set! hoge (lambda (x y) (cons x y))) (hoge 3 4) (set! cons list) (hoge 3 4)
結果は (3 . 4)と(3 4)
もう一つの方法は、トップレベルの式をbeginのシーケンスの様に解釈する。つまり
(begin (define (hoge x y) (cons x y)) (begin (hoge 3 4) (begin (define cons list) (begin (hoge 3 4)))))
みたいに扱う。
(注:実際のトップレベルでは(begin ...)の最初の式を評価した結果をディスプレイなりに出力する特別なbeginにする)
結果は(3 4)と(3 4)となる。

どっちにするかは好みだが、5.2.2との絡みから個人的には最初の方法に一票入れたい。