真面目に調べていないけれども、O’Caml と Scheme で微妙にスコープの範囲が違うらしい。O’Caml だと気軽に以下のようなコードを書きます。
let s n =
let n = n + 1 in
n
Scheme で同じようなことを以下のようにやってみます。
(define (s n)
(define n (+ n 1))
n)
Scheme の define は letrec なのかな。O’Caml でも以下のプログラムは動かないからね。
let s n =
let rec n = n + 1 in
n
便利だからついつい define を使ってしまうけれども、正しくは以下のように書くべきだったみたいです。
(define (s n)
(let ((n (+ n 1)))
n))
このミス、20世紀に何十回となくはまった気がするけれども、10年ぶりにはまりました。