>>406
(define (my-if a b c)
 (let ((if if))
  (if a b c)))
--> syntax errorまたはunbound variable 'if みたいなエラー

(let ((if list))
 (define (my-if a b c)
  (let ((if if)) (if a b c)))
 (if 1 2 3))
--> (1 2 3)

これはifに束縛値があれば変数として扱い、なければsyntax keywordとして扱っているからで、構文解析するときにはトップレベルから発生しているすべての束縛を記録しておく必要があるなり。これはよくcompile time environmentと呼ばれているなり。

ちなみにgaucheで実行できるのは、
gosh> (define (my-if a b c) (if a b c))
で中間コードに変換されるときにifがsyntaxのifとして中間コードに書き込まれていて後の
gosh> (define if list) の影響を受けないから。
gosh> (define if list) (define (my-if a b c) (if a b c)) (my-if #t 0 1)
とやれば(#t 0 1)が返されるはず。
gosh> (define (my-if a b c) (let ((if if)) (if a b c)))
はやはりエラーになるんじゃないかな?

最後に、どのmy-ifの定義もifと同等の定義にはなっていないよ。これは念のためなり。