Skip to content

cl annot Bugs

Yokota Yuki edited this page Sep 21, 2022 · 3 revisions

まずは Reader Macros | Common Lisp - Bad Examples を参照のこと。

@doc 関連

上記 reddit でほとんど指摘されている。

  • @doc を body がない defun, defmethod などにつけると、戻り値を置き換えてしまう。
  • @doc を、 defvar の初期値を与えない (defvar *foo*) 用法の式に使うとエラーになる。
  • また、 @doc を docstring がある関数に適用すると、処理系によってはエラーになる。
  • method-qualifier を持つ defmethod に与えると、規格違反のコードに展開される。

defstruct 関連

  • defstruct オプションの (:constructor) は「デフォルトのコンストラクタ関数を作る」という意味だが、 (:constructor nil) の「コンストラクタ関数を作らない」と混同されて扱われている。
  • また、 (:constructor nil) のみを二回書くと、コンストラクタ関数を作らないという意味になるが、デフォルトのコンストラクタ関数と同名のシンボルが export される。
  • defstruct が作る関数のうち、 copier と predicate を export する手段がない。

declarations 関連

バグ

  • ANSI CL の declaration という宣言は proclamation にしか使えず、 declaration に使ってはいけないのだが、 @declaration は declare の内部に展開してしまう。結果として規格違反のコードが生成される。
  • @ignore, @ignorable, @dynamic-extent には、 (function <関数名>) が渡せない。例えば @ignore (function foo) と書くと、 (declare (ignore function foo)) と括弧を消して展開されてしまう。結果として関数を ignore する記法が書けない。

よくない挙動

  • declaration を足す annotation は、 (declare ...) を置くことができる場所でしか使用できない。この仕様は展開形から明らかだが、どこにも明示されていない。
  • なぜか @optimize は qualifier を一つしか取れない。

defannotation 展開器のあまりよくない挙動

  • defannotation :inline オプションを使うと read-time に macroexpand する。この挙動は他の Common Lisp 標準関数は行わない。私には理解するのが難しい。
  • progn で囲った form に作用する場合は、最後の form にしか作用しない。 cl-annot.util:progn-form-replace-last という関数がそれを行なっている。
  • annotation の展開時、その中の CL シンボルでない macro-form を先に展開してしまう。これはネストした annotation を展開するために行なっている。しかし、他パッケージの macro form を破壊してしまうため、 特定の macro form を macrolet で引っ掛けるようなコードでは問題が起きる可能性がある。
Clone this wiki locally