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

関数内での関数定義はfletまたはlabels

common lisp

http://d.hatena.ne.jp/komamitsu/20090627/1246116070 で、関数内での関数定義をさせる際にdefunを使っていたのですが、これだと外部からも参照できてしまうのでした。

letのようにS式の中に関数定義を閉じさせる必要があったのですが、そういう場合はfletかlabelsを使うと良いらしいです。
更に内部でも関数名を使う場合(再帰とか?)はlabelsを使うべきらしい。

[3]> (defun a (x) (labels ((b (x) (print x))) (b x)))
A
[4]> (a 3)

3 
3