タグ付けされた質問 「byte-compilation」

EmacsのEmacs Lispコンパイラ用で、lispコードをバイトコードにコンパイルして、コンパイルされていないlispコードと比較して実行を高速化します。バイトコンパイルされたコードは、バイトコードインタープリターによって読み取られます。

4
古いバイトコンパイルされたelispファイルを回避できますか?
時々、Emacsを起動すると、次のようなメッセージが表示されます。 ソースファイル `/home/USER/.emacs.d/elpa/....el 'はバイトコンパイルされたファイルよりも新しい また、開発中のパッケージを編集して、再コンパイルするのを忘れることもあります。新しいファイルをロードしようとすると、Emacsがまだ古いコンパイル済みファイルを使用していることに気付くのに時間がかかります。 Emacsに、それぞれのソースファイルよりも古いバイトコンパイルされたファイルを完全に回避するように指示できる方法はありますか?

2
関数またはマクロはバイトコンパイラの警告を指定できますか?
原則として、任意の数の引数を取る関数を作成しています。ただし、実際には、偶数の引数のみが渡される必要があり、 そうでない場合は望ましくない結果が生成されます。 コンテキストのダミーの例を次に示します。 (defun my-caller (&rest args) (while args (call-other-function (pop args) (pop args)))) elispファイルがバイトコンパイルされると、バイトコンパイラーは、間違った数の引数で呼び出されている関数を検出すると、警告をスローします。明らかに、これはで発生my-callerすることはありません。これは、任意の数を取るように定義されているためです。 それでも、設定できるシンボルプロパティや、(declare)その定義に追加できるフォームがあるかもしれません。この関数には偶数個の引数のみを指定する必要があることをユーザーに通知するもの。 この制限をバイトコンパイラに通知する方法はありますか? そうでない場合、関数の代わりにマクロで可能ですか?

1
警告の抑制:自由変数(およびその他)への割り当て
emacs lispファイルをバイトコンパイルする際に、「自由変数への割り当て」警告を抑制するにはどうすればよいですか? 私は実際に、flycheckを使用するときに特定のバッファーでそれを抑制することに主に興味を持っていますが、これはバイトコンパイラに渡されることを理解しています。 また、抑制できるすべての警告/エラーのリストを取得することもできます。 更新: 完全を期すために、コンパイラの警告を無効にする理由は(言語に依存しない)多くの理由があることを明確にさせてください。いくつかの例:レガシーコードのリント適用フレームワークへの移行を容易にするため、スクラッチファイルおよびレシピをライブコンテキスト内で実行するため、優先度の高い問題を修正しながらノイズを除去するため、またはコンパイラーが間違っているため。

3
字句バインディングを使用したlet内のDefunは、「関数が定義されていることが不明です」というバイトコンパイル警告を表示します。
defun内部でlet字句バインディングを使用してクロージャーを作成することにより、静的変数の効果を取得したい。ただし、ファイルをバイトコンパイルすると、警告が表示されます。私は何か間違ったことをしていますか、そうでない場合、この警告を抑制する方法はありますか? MCVEを作成しました: ;; -*- lexical-binding: t -*- (let ((count 0)) (defun increase-count () (interactive) (setq count (1+ count)) (message "Count is: %d" count)) ;; The warning happens here. (increase-count)) コードは期待どおりに機能します。関数increase-countは「Count is:n」を出力します。nは呼び出されるたびに増加します。ただし、このファイルをバイトコンパイルすると、次の警告が表示されます。 In end of data: mcve.el:11:1:Warning: the function ‘increase-count’ is not known to be defined. increase-countletブロックの最後に呼び出される前に、常に定義する必要があるように思えます。そうではありませんか?


1
defcustomを使用したマクロは、バイトコンパイル時に「変数としてのシンボルの値は無効です」というエラーにつながる
私のパッケージの2つには、defcustomフォームで定義された変数に本体が依存するマクロがあります。 Melpaからパッケージをインストールすると、バイトコンパイルは次のように終了します。 エラー:変数としてのシンボルの値は無効です:my-defcustom-variable 次に、ファイルをバッファで開いて手動でバイトコンパイルします。 autoloadクッキーを試してみましたが、それでも同じ動作をします。 ここに重要なものがありません。


1
特定のライブラリーが意図的に欠落している可能性がある場合の「警告:自由変数への割り当て」の処理
私のモードのバイトコンパイル: (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: …

2
`Warning(bytecomp)`は少しあいまいです-詳細情報を入手できますか?
emacsを起動すると、ポップアップウィンドウにいくつかのバイトコンパイル警告が表示されます。 Warning (bytecomp): `interactive-p' is an obsolete function (as of 23.2); use `called-interactively-p' instead. [7 times] Warning (bytecomp): Use `with-current-buffer' rather than save-excursion+set-buffer emacsで場所を教えてもらえますか?

1
eval-when-compile:defsubst vs defmacro vs define-inline
私はいくつかの単純な関数をinit.elで定義しました、例えばmy-cache-file: (defconst my-cache-directory (expand-file-name ".cache" user-emacs-directory)) ; ~/.emacs/.cache (defun my-cache-file (x) (expand-file-name x my-cache-directory)) ; ~/.emacs/.cache/x (setq savehist-file (my-cache-file "savehist")) (setq backup-directory-alist `(("." . ,(my-cache-file "backups/")))) これはの良いユースケースのように思われましたdefsubst: (defsubst my-cache-file (x) ...) その後、コンパイルについて学び始め、さらに最適化したいと思いました。私は単純に試しました: (defsubst my-cache-file (x) (eval-when-compile (expand-file-name x my-cache-directory))) しかし、コンパイラーは(正しく)フリー変数について不平を言ったxので、代わりに呼び出しコードをラップしました。 (setq savehist-file (eval-when-compile (my-cache-file "savehist"))) (setq backup-directory-alist `(("." . ,((eval-when-compile …

1
Emacsがパッケージをインストールするときに、変更されたバッファーを保存するように要求するのはなぜですか?
バッファー内の何かを変更し、packages.elからパッケージをインストールすることを決定するたびに、Emacsは変更されているため、他のバッファーを保存するかどうかを繰り返し尋ねてきます。 このバッファとパッケージのインストールの関係を理解できません。インターネット上で適切な答えは見つかりませんでした。 この背後にある論理を説明したい人はいますか? 前もって感謝します。

1
同じ.emacs.dでEmacsの複数のバージョンを実行するにはどうすればよいですか
あるいは、24.5と25.0.50を実行します。残念ながら、25.0.50からインストールおよびコンパイルされたパッケージcl-struct-defineは、Emacs 24.5(一般的な原因)では動作しません。 簡単な解決策の1つは、何もバイトコンパイルしないことです。しかし、それは物事をかなり遅くします。 .emacs.d24.5と25.0.50の両方に同じものを使用しながら、(パフォーマンスのために)コンパイルされたパッケージをどのように使用できますか?また、コンパイル済みファイルを無視して24.5で大丈夫です。

2
シンボルと文字列の比較におけるパフォーマンスの違い
ではsx.el、引数として、GETまたはPOST引数として渡したかどうかを確認する必要がある場合があります。 現在、文字列として渡される引数があり、(string= "GET" url-method)それをと比較するために使用してい"GET"ます。 シンボルに変更することによるelisp / byteコンパイルの利点はあります(equal url-method 'GET)か?

3
マルチファイルパッケージのバイトコンパイル:「関数が定義されているかどうかは不明です」
(ばかげた)パッケージに次のファイルがあるとします。 ファイルtest1.el: ;;; test1.el --- ;;; Code: (defvar test-var1) (defun test-fun1 (test) nil) (require 'test2 "./test2.el) (provide 'test1) ;;; test1.el ends here ファイルtest2.el: ;;; test2.el --- ;;; Code: (defun test-fun2 () (let ((test test-var1)) (test-fun1 test))) (provide 'test2) ;;; test2.el ends here それなら私は走ります: emacs -batch -f batch-byte-compile *.el 次の結果が得られます。 Compiling …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.