2011-03-20 10 views
1

対話型関数名機能を使用しようとしています。 emacs lispマニュアルでは、次のように書いています。Elisp対話型関数名

'a' 関数名(つまり、fboundpを満たすシンボル)です。既存、完了、プロンプト

だから私は小さなテストコードでそれを試してみました:私はとABCDテストしてみました

をabcdの:シンボルの関数定義がvoid:

(defun testfun1() 
    (message "hello, world!")) 

(defun test (abcd) 
    (interactive "aTheme name: ") 
    (abcd)) 

Emacsは、

テストを言ってエラーが発生しますfboundpなら、tを返します。ですから、私はインタラクティブで 'a'オプションを使う方法についてはかなり混乱しています。 体には何かヒントがありますか?

答えて

5

をあなたの機能testは関数としてその引数abcdを受信しますが、あなただけのリストの最初の位置でそれを参照するシンボルを置くことによって機能を呼び出すことはできません評価される。 Emacs Lispには、のLisp-2あるため、インタラクティブクエリに提供される機能への参照は、シンボルabcd値スロットにないその機能スロットが格納されます。そのオブジェクトが、それはあなたのケースであり、シンボルである場合、

(abcd) 

ようなリストの評価ルールは、最初のオブジェクトの機能スロットで探して関与。あなたは、シンボルの値スロットで参照機能を呼び出すしたい代わり場合は、the funcall functionを必要とする:

abcdを取るその 値スロット外の値をつかむ、と言う、」
(funcall abcd) 

は、提供それはですその関数がシンボルのファンクションスロットの中のリストの最初の位置で参照されているか、関数オブジェクトへの直接参照によって参照されていたのと同じように、ここで呼び出すことができます。

ここにはan answer to a similar questionがあり、さらにプローブを行うのに便利です。

+0

ああ、ありがとうございました。 – sudo

0

このこのトリックを行う必要があります。

(defun test (abcd) 
    (interactive "aTheme name: ") 
    (call-interactively abcd))