特定のライブラリーが意図的に欠落している可能性がある場合の「警告:自由変数への割り当て」の処理


12

私のモードのバイトコンパイル:

(defun dict-setup-expansions ()
  "Add `dict-mode' specific expansions."
  (set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))

警告を出します:

Warning: assignment to free variable `er/try-expand-list'

er/try-expand-list外部で定義されているため、これは正常な状況です。図書館expand-regionにあるhttp://elpa.gnu.org

expand-regionライブラリへのモードレジスタ拡張ですが、モードなしでexpand-regionモードを実行しても問題ありません。

警告に対処する適切な方法は宣言を追加することだと思います:

(defvar er/try-expand-list)

defvar ドキュメントは言う:

The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.

使用します-*- lexical-binding: t -*-。それはdefvar変数なしer/try-expand-listでレキシカルスコープにあり、私は本当のバグを持っているということですか?


2
補足:で記号を引用しないでください(defvar er/try-expand-list)
JeanPierre 2016年

@JeanPierre修正済み。
Givenkoa

回答:


10

いいえ、setそしてsetqレキシカル変数を宣言しません。ありませletん。letここで使用した場合、バグが発生しますが、これで問題ありません。警告は、動的変数を使用するときにタイプミスを見つけるために主に存在します。

警告を消すにdefvarは、質問のように使用しますが、記号引用しないでください。


eval-when-compile冗長にラップするだけdefvarですか?なしでは警告は表示されませんeval-when-compile。... eval-when-compileなどのアクティブなコードを使用する場合に必要と思われ(require ...)ます
gavenkoa

3
defvarのラップは冗長になります。
lunaryorn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.