< らむ太語録 | リストモナドと非決定性 >
2010/05/16
ちょっとものを数えたかったのでローカルにcountという関数を定義したら:
(labels ((count (...) ...)) ...)
Allegro CLに怒られた。
Compiling a function definition for the name count as a labels. This name is in the common-lisp package and defining it will be a violation for portable programs.
そりゃ名前はぶつかるけど、俺のcountはローカルな範囲でしか 使わないんだからcl:countをシャドウしていいんだよ。 わかっててやってるんだから好きな名前使わせてくれよ。
Allegroがこんなお節介を焼く理由(のひとつ)は、 CLのマクロが健全ではないからだろうけど。 ローカルなcountのスコープでマクロを使って、その展開形にcl:countの 呼び出しが含まれていると、グローバルなcountを呼ぶつもりがローカルなcountを 呼んじゃう。でもコンパイラはマクロ展開結果を知ってるんだから、 せめて展開してぶつかる時だけ教えてくれてもいいのになあ。
Tags: Lisp, Scheme, Programming
Post a comment