次を実行すると、エラーが発生します。
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
(lambda (status) (funcall func))))
(caller (lambda() (message "called")))
結果:
error in process filter: Symbol's value as variable is void: func
この問題を解決する最良の方法は何ですか?基本的に、どこかからのコールバックを受け入れ、別のラムダでラップし、それをurl-retrieveへのコールバックとして使用する必要があります。
発信者をに変更した場合
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
`(lambda (status) (funcall ,func))))
できます。ただし、funcがflycheckによって渡されており、マクロ展開によって中断されるため、これを行うことはできません。私がやっていることの完全なコンテキストを確認するには:https : //gist.github.com/m0smith/b5961fda6afd71e82983
`および、はマクロ展開されていると想定しました。その形が何と呼ばれるにせよ。EMACS 23で作業したいのですが、字句機能はありますか?
—
M Smith
のない使用がない場合
—
2014
FUNC
を超えてfuncall
、その後、論理的にあなたがいないここに結合字句必要が。それを使用することに問題はありませんが、一部のコードが実際に変数 を使用する必要がない限り、それは必要ありませんFUNC
。それが必要ない場合(これまでのところはこれまでの説明です)、その値をコンマで逆引用符を使用してその値で置き換えるだけです。
字句バインディングは、Emacs 23(およびそれ以前)で使用でき
—
ドリュー
lexical-let
ます。グローバル変数は、lexical-binding
Emacsの24で利用可能です
lexical-let
変数を使用または設定することですlexical-binding
。表示されていない「マクロ」の問題を明確にしてください。