無視できる変数を宣言するにはどうすればよいですか?


10

Unused lexical variable展開されるマクロを使用して定義された関数でバイトコンパイラの警告を回避するにはどうすればよいdefunですか?

たとえば、マクロdefun-rcirc-commandin rcirc.el は、targetいくつかの呼び出しで使用されていない変数を使用します。

Common Lispでは、次のignorable 宣言を使用できます (declare (ignorable target))

悪い解決策:

  • を使用しない(setq target target)すべてのユーザーに、多くのマクロ呼び出しを変更する必要があるようなものを 追加します。defun-rcirc-commandtarget

  • アンダースコアで無視変数を接頭辞- _target-理由は助けない_手段ignoreではなく、ignorableつまりは、それが使用されるとき、私が得ますvariable '_target' not left unused


それらに下線を付けることでそれを行うべきです。
politza

@politza:_は無視、無視できないことを意味します
sds

1
問題を解決するためにマクロを変更しますか?おそらく(ignore VAR)、すべてのdefun引数を、@ body展開の前に置くだけで、おそらくエラーが発生しなくなります。
Jordon Biondo 2015

回答:


13

これまでに行った方法は、形状の呼び出しを追加することです

(ignore <var>)

この関数呼び出しは最適化されますが、その前にコンパイラーは使用としてカウントするため、「未使用」の警告はトリガーされません。


-1

コードを見ると、targetはグローバル変数ではなく、呼び出されたときに作成された関数に渡されるように見えます。その場合は、マクロに対してローカルなシンボルとして作成することをお勧めします。引数を受け入れてそれに10を加える関数を作成するマクロの簡単な例:

(defmacro xxx (name)  
  ""
  (let ((target (make-symbol "target")))
  `(defun ,name (,target) (+ 10 ,target))))

呼び出す

(xxx hamster)

1つの引数を受け入れるhamsterという名前の関数になります。

その後、あなたは呼び出すことができます

(hamster 5)

そして、それは戻り15ます。

トリックは、新しい関数の引数として機能する新しいシンボルを作成することです。

編集:

渡されたbody式で生成されたシンボルを参照している場合は、次のように名前を呼び出しに含めることを私はいつも見ています。

(defmacro xxx (name t2 &rest body)  
  ""
  (let ((t2-arg (make-symbol "target")))
  `(defun ,name (&optional ,t2-arg) 
     (let ((,t2 (or ,t2-arg 10)))
       ,@body))))

これにより、呼び出しが次のようになります。

(xxx hamster target (+ target 20))

どこ

(hamster)

戻る30

(hamster 20)

を返します40

確かに、この方法でマクロを作成すると、パラメーターが宣言され、後で使用されるように見える使用方法を見るまで、常にバグが発生します。


2
関数の本体はマクロに渡され、を参照できる必要がありますtarget。IOW、あなたの素晴らしい提案はこの特定のケースには当てはまりません。
sds 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.