タグ付けされた質問 「elisp-macros」

Emacs Lispマクロを使用すると、新しい制御構造やその他の言語機能を定義できます。マクロは関数のように定義されますが、値を計算する方法を指示する代わりに、別のLisp式を計算する方法を指示します。次に、それが評価されて値を計算します。この式をマクロ呼び出しの「拡張」と呼びます。マクロ呼び出しは最初に展開されてから評価され、その評価の値が返されます。

2
条件式の「and」と「when」
これは、この回答に対するコメントのフォローアップです。次のコードは同等のようです: (and a b) (when a b) もちろんand:あなたはより多くの条件に置くことができます(and a b c d)手段を(when (and a b c) d) 私はwhen分岐を表現するためだけに使用する傾向があります。実際の違いはありますか?どちらを使用するのが良いですか? EmacsのCソースは手元にありません。andC関数です。whenはに展開されるマクロでありif、それ自体はC関数です。


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

3
マクロを使用する場合と使用しない場合[クローズ]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 閉じた3年前。 プログラムでマクロを使用する必要があるのはいつですか? この質問は、@ tarsiusによる有益な回答に触発されたものです。多くの人が他の人と共有する素晴らしい経験があると思います。この質問がすばらしい主観的な質問の 1つになり、Emacsプログラマーの助けになることを願っています。

2
入力なしの使用方法は?
docstringから: 保留中の入力がない限り、BODYを実行します。 入力が到着すると、BODYの実行が終了し、while-no-inputtが返されます。終了すると、nilが返されます。BODYが終了した場合、while-no-inputBODYが生成した値を返します。 私が正しく理解している場合、このマクロを使用すると、インターフェースを停止せずに重い計算を実行できます(試みます)。それは確かに私が魅力的だと思うコンセプトですが、それが実際にいつ役立つのか疑問に思っています。 計算はいつでも中断される可能性があり、それがどこで発生したかに関する情報も、後で簡単に再開する方法もありません。結局それはそれほど役に立たないかもしれないと思います... while-no-inputマクロの使用に推奨される方法はありますか? このマクロの実際の使用例はありますか?

3
リストをループして複数のdefunを作成するにはどうすればよいですか?
リストにあるすべてのテーマに対してインタラクティブな関数を動的に作成できるように、emacs構成を最適化する作業をしています。 以下は、私が機能させようとしている構成の簡略版です。 ;; List containing names of functions that I want to create (setq my/defun-list '(zz-abc zz-def zz-ghi)) ;; Elisp macro to create an interactive defun whose name ;; is passed as the macro argument (defmacro my/create-defun (defun-name) `(defun ,defun-name () (interactive) (let ((fn-name (symbol-name ',defun-name))) (message "Testing creation of …

1
マクロの変数スコープはどのように決定されますか?
で定義されている次のサンプルマクロを見てみましょうmacro.el。 (defmacro some-macro (&rest body) `(let ((some-variable 1)) ,@body)) そして、別のファイルで定義された次の関数を取りますfunction.el。 (defun some-function () (some-macro (do-something))) ときにfunction.elバイトコンパイルされ、うsome-variable字句または動的バインディングでバインドできますか? これはファイルがを使用しているかどうかに依存することを理解している-*- lexical-binding: t; -*-ため、私の質問は特に以下の状況に関係しています。 場合function.el結合が、用途は字句macro.elません。 場合macro.el結合が、用途は字句function.elません。 some-var内部で(defvarを使用して)グローバルに宣言されている場合、違いはありfunction.elますか?もしそうなら、私はそれがそうでない場合に特に興味があります。

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
非インターンシンボルとマクロ展開を理解していますか?
私の知識不足を例を挙げて説明したいと思います。 次の2つのマクロ定義を使用して、 (defmacro for (var from init to final do &rest body) "Execute a simple for loop: (for i from 1 to 10 do (print i))." (let ((tempvar 'max)) `(let ((,var ,init) (,tempvar ,final)) (while (<= ,var ,tempvar) ,@body (setq ,var (1+ ,var)))))) (defmacro for (var from init to final …

1
オートロードと変数
私は関数のオートロードの機能を理解しています(そのような関数が呼び出されたとき、またはそのドキュメント文字列が取得されたときにロードするファイルを登録します)。ただし、変数やマクロと組み合わせてオートロード機能を使用する方法は明確ではありません。 2つの質問があります。 パッケージにパラメーターがあり、ユーザーが設定できる変数として実装されているが、自動ロードされない場合はどうなりますか?そのような変数はオートロードされるべきですか?そうでない場合、そのような変数は存在しないことがわかります。Lisp環境は、パッケージからオートロードされた関数が使用されるまで(通常は構成ファイルのロード後)、ユーザーが変数を設定するまで、デフォルト値を含め、それらについて何も知りません。 /彼女の設定ファイル、それは存在しない変数を設定するようなものです。変数の値が空でないリストであり、ユーザーがその値を使用pushまたはadd-to-list変更する場合、正確にはどうなりますか?デフォルト値は失われますか? マクロがオートロードされるとどうなりますか?いつマクロをオートロードする必要がありますか?

1
Setfの奇妙な拡張
setf私は何ができるかを理解しようとして、 (macroexpand '(setf (aref vec i) val)) ⇒ (let* ((v vec) (v i)) (aset v v val)) これは明らかに間違っているようです。 しかし、(setf (aref ..失敗する実際のインスタンスを作成できませんでした。例えば (setq vec (make-vector 10 nil) i 3 val 'foo) ⇒ foo (setf (aref vec i) val) ⇒ foo vec ⇒ [nil nil nil foo nil nil nil nil nil …

1
「cl-flet」マクロは再帰的な関数を許可していません
私は廃止されたelispマクロに慣れており、fletに変更するように言われましたcl-flet。しかし、この変更を行うと、一部のelispプログラムが機能しなくなりflet、その理由は、とは異なり、cl-flet再帰的な関数が許可されていないことに気付きました。たとえば、以下の関数を定義します (defun show-problem-in-action (x) (cl-flet ( (factorial (n) (if (= n 0) 1 (* n (factorial (- n 1))) ))) (factorial x) )) 一つは取得しないエラーを呼び出すことにより、 (show-problem-in-action 0) 出力:1 「cl-flet-defined」関数factorialは、「x = 0」の場合、それ自体を呼び出さないためです。しかしながら (show-problem-in-action 5) エラーを生成しますvoid-function factorial。 一方、次のようなcl-flet非推奨のマクロfletで置き換える (defun no-problem-with-deprecated-macro (x) (flet ( (factorial (n) (if (= n 0) 1 (* n (factorial …

2
頻繁に呼び出すマクロを変更するにはどうすればよいですか?
のuse-package整理に使用しinit.elます。私の宣言はすべてを使用していることに気付きました:ensure t。宣言の例は次のとおりです。 (use-package auto-complete :ensure t :diminish auto-complete-mode :init (global-auto-complete-mode t)) すべてのuse-package宣言でを使用しているため:ensure t、use-package.elを直接変更せずuse-packageに暗黙的にインクルードするように変更する方法はあり:ensure tますか?理想的には、別の名前の関数を使用しないようにします。 私は少し慣れてadvice-addいますが、これはフックや環境を関数に追加するために使用され、関数やマクロ自体を変更するためではないという印象があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.