2

議論が何であれ、それはまったく何もしていないようです。また、バイトコンパイルの警告にはまったく影響しません。その説明に従って使用した場合。それを使用する方法の例はありますか?

たとえば、次のコードです。

(defmacro deflocal (var &rest body)
  (let ((symb var)
        (val (car body))
        (doc (cadr body)))
    `(progn
       (let ((byte-compile-warnings nil))
       ;; (byte-compile-disable-warning 'make-local)
       (set (make-local-variable ',symb) ,val)
       (put ',symb 'variable-documentation ,doc)
       ;; (byte-compile-enable-warning 'make-local)
       ))))

やりたいことは何でもできbyte-compile-warnings、コンパイラの出力にはまったく影響しません(自由変数への割り当てに関する警告が引き続き表示されます。

編集:

これは、上記の説明では不透明だったからです。これが私が使いたくない理由ですdefvar。Emacs外のプログラムと通信するための一種のインタラクティブシェルを開始するインタラクティブ関数があります。このシェルは、ユーザーが直接起動することも、いくつかの異なるメジャー モードに入るとき、またはコンパイルや構文チェックなどの他のタスクを実行するときに間接的に起動することもできます。システムはかなり複雑です。

私は何度も、特定の関数が最終的に不要なバッファに変数を設定する可能性があることに遭遇しました。たとえば、コンパイル フックが、接続オブジェクトを所有するバッファーで呼び出されると想定する関数を呼び出す場合。接続が失敗する可能性があるため、何らかの理由で接続が失敗したことを検出すると、システムは自動的に接続を復元しようとします (残念ながら、私が接続しなければならない他のプログラムは非常に不安定であり、その通信機能は十分に実装されていません)。 . したがって、たとえば、flymake プロセスが接続を復元する必要があることに突然気付いた場合、その時点で flymake があったバッファに接続を作成します。同様に、コンパイル モード バッファー、完了バッファー、ヘルプ バッファーなど。これらの文脈の変化の後を追うことは非常に困難です。

これで、接続オブジェクトを参照する変数を他のバッファーが誤って宣言したり、エラーが発生したりすることがないと確信できれば、安全であり、問​​題が発生したときに簡単にデバッグしてトラブルシューティングを行うことができます。しかし、一度使っdefvarてみると、ルージュの複製プロセスがいくつか作成されていることに気付き、誰がそれを行ったのかまったくわかりません。

4

2 に答える 2

5

確かに、byte-compile-warningsあなたが望むことはしません。代わりに、どこかで変数を宣言する(defvar <VAR>)か、警告をトリガーするコードをwith-no-warnings.

コード内の let バインディングはbyte-compile-warnings、コンパイル時ではなく、コードの実行時に適用されます。


編集:

heredefvarで説明されているように、引数を 1 つだけ使用しても変数がどこにもバインドされないことを確認するための簡単なテストを次に示します。

(defvar foo)
(boundp 'foo) ;; -> nil

(defvar bar t)
(boundp 'bar) ;; -> t
于 2012-11-16T17:02:29.267 に答える
3

この変数byte-compile-warningsは、バッチ コンパイル中に出力される警告を制御するためのファイル ローカル変数として使用するのが最適です。

使用の副作用を懸念しているように聞こえますが、 defvar動的にバインドされるグローバル変数のみを作成します (変数が既にローカルにバインドされていない限り)。

ローカル変数を作成した後make-local-variable 、関数内から使用して、変数バッファーを 現在のバッファーに対してローカルにしますが、他のすべてのバッファーに対してはグローバルのままにします。したがって、make-local-variable1 回だけ呼び出した場合、変数のコピーは 2 つだけになります。1 つは動的にバインドされ、すべてのバッファーで共有され、もう 1 つは単一のバッファーに固有です。 強調されたテキスト (make-local-variable VARIABLE)

Make VARIABLE have a separate value in the current buffer.
Other buffers will continue to share a common default value.

変数のグローバル バージョンが存在しないことを確認したい場合は、 レキシカル バインディングを調べる必要があります。

最後に、このファイルをバッチ コンパイルするときの警告を静かにするに.el は、次のコードをファイルの末尾に配置します。

;; Local Variables:
;; byte-compile-warnings: (not free-vars)
;; End:
于 2012-11-16T18:45:04.690 に答える