-
Notifications
You must be signed in to change notification settings - Fork 0
cl annot Bugs
Yokota Yuki edited this page Sep 21, 2022
·
3 revisions
まずは Reader Macros | Common Lisp - Bad Examples を参照のこと。
上記 reddit でほとんど指摘されている。
-
@doc
を body がないdefun
,defmethod
などにつけると、戻り値を置き換えてしまう。 -
@doc
を、defvar
の初期値を与えない(defvar *foo*)
用法の式に使うとエラーになる。 - また、
@doc
を docstring がある関数に適用すると、処理系によってはエラーになる。 - method-qualifier を持つ
defmethod
に与えると、規格違反のコードに展開される。
-
defstruct
オプションの (:constructor) は「デフォルトのコンストラクタ関数を作る」という意味だが、(:constructor nil)
の「コンストラクタ関数を作らない」と混同されて扱われている。 - また、
(:constructor nil)
のみを二回書くと、コンストラクタ関数を作らないという意味になるが、デフォルトのコンストラクタ関数と同名のシンボルが export される。 -
defstruct
が作る関数のうち、 copier と predicate を export する手段がない。
- 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
: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
で引っ掛けるようなコードでは問題が起きる可能性がある。