Island Life

< らむ太語録 | リストモナドと非決定性 >

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

Name: