#:g1: (declare (ignore initargs) (dynamic-extent initargs)) って意味あるの

Posted 2021-05-20 16:53:55 GMT

Eclipse Common Lispのソースを眺めていると、

(declare (ignore initargs) (dynamic-extent initargs))

というのが結構出てきます。

これって果して何かしらの効果あるのだろうかと気になります。
そもそもignoreしているので、dynamic-extentもなにもないのですが、何か深い理由がありそうななさそうな。

Eclispse CLでコンパイル結果を確認してみる

とりあえず、Eclispse CLでコンパイル結果が変化したりするのか確認してみます。

(defun foo (arg)
  (declare (ignore arg) (dynamic-extent arg))
  42)

> (disassemble 'foo)

#include <eclipse.h>

clObject clExtraArgs(clProto), clMissingArgs(clProto);

static clObject I_1, I_42;

clObject usrFoo clVdecl(_ap) { clObject arg; { clBeginParse(_ap); clSetq(arg, (_clVp(_ap) ? clVpop(_ap) : clMissingArgs(I_1, clEOA))); if (_clVp(_ap)) clExtraArgs(clVargs(_ap), clEOA); clEndParse(_ap); } return(clValues1(I_42)); }

void clLoader __P((void)) { clDbind(clstarPACKAGEstar); clDbind(clstarREADTABLEstar); clDbind(clstarLOAD_TRUENAMEstar); clDbind(clstarLOAD_PATHNAMEstar); clSetq(I_1, clIntFixnum(1)); clSetq(I_42, clIntFixnum(42));

clMakeClosure(0, usrFoo, clNULL_HOOK); clUnwind(4); } NIL

(defun bar (arg) 42)

> (disassemble 'bar)

#include <eclipse.h>

clObject clExtraArgs(clProto), clMissingArgs(clProto);

static clObject I_1, I_42;

clObject usrBar clVdecl(_ap) { clObject arg; { clBeginParse(_ap); clSetq(arg, (_clVp(_ap) ? clVpop(_ap) : clMissingArgs(I_1, clEOA))); if (_clVp(_ap)) clExtraArgs(clVargs(_ap), clEOA); clEndParse(_ap); } return(clValues1(I_42)); }

void clLoader __P((void)) { clDbind(clstarPACKAGEstar); clDbind(clstarREADTABLEstar); clDbind(clstarLOAD_TRUENAMEstar); clDbind(clstarLOAD_PATHNAMEstar); clSetq(I_1, clIntFixnum(1)); clSetq(I_42, clIntFixnum(42));

clMakeClosure(0, usrBar, clNULL_HOOK); clUnwind(4); } NIL

上記foobarで何も変化なしです。

Eclipse CL以外の処理系でもちょっと確認してみましたが、手元の処理系では差が出るものはありませんでした。

推理

色々考えてみましたが、Eclipse CLのコードにはかなりdynamic-extent宣言が多く、何かの雛形から生成されたようなコードも多いので、雛形として(declare (dynamic-extent initarg))が付いているところに、追加で、(declare (ignore initarg))がさらに機械的に付加されたのかもしれません。

(declare (ignore arg) (dynamic-extent arg))で何か面白い応用ができないか色々考えてみましたが、特に思い付かず……。
何か面白い応用があれば是非教えてください。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus