読者です 読者をやめる 読者になる 読者になる

オプショナル引数のスコープ

Scheme におけるオプショナル引数の在り方について思いを馳せていた。
展開形を考えたときに不意に気になったことがあって Gauche で以下を試してみた。

(define (hoge a :optional (b 1) (c b))
  (list a b c))

想像通り Gauche ではこれは有効な定義である。
変数 c のデフォルト引数を定義する中で変数 b が見えているし、 b の初期化の方が先に済んでいる。 Scheme の各引数の評価順序が未定義であることやスコープのルールを考えると一貫性に欠ける挙動であるように思う。
ちなみに、先日 R6RS 向けに私が書いたマクロ (id:SaitoAtsushi:20110222:1298366644) は Gauche に倣ったものであるので同様の挙動である。
Document ID: ac1e1ec6210fddf6b09f7e9b08e8ef