2011-06-21 12 views
8

例如,這裏是一個宏:爲什麼elisp宏返回的函數的應用程序不工作?

(defmacro my-macro (x y) 
    (if (> x 0) 
    `(lambda (z) (+ z ,y)) 
`(lambda (z) (+ ,x z)))) 

(my-macro 2 3)回報(lambda (z) (+ z 3))

然而,((my-macro 2 3) 1)返回一個錯誤的說法,

Debugger entered--Lisp error: 

(invalid-function (my-macro 2 3)) 
    ((my-macro 2 3) 1) 
    eval(((my-macro 2 3) 1)) 
    eval-last-sexp-1(nil) 
    eval-last-sexp(nil) 
    call-interactively(eval-last-sexp nil nil) 

我缺少什麼?

+0

如果您對提供的幫助滿意,請不要忘記接受答案。見http://stackoverflow.com/faq#howtoask – phils

回答

7

的Emacs Lisp需要列表form的第一個元素是一個內置函數(或subr),一個lambda-expression(即(lambda LIST . LIST))或macro lambda-expression(即(macro lambda LIST . LIST))。第一個元素也可以是symbol,其功能槽包含有效的第一個元素。

(my-macro 2 3)沒有所需的格式,所以它是一個無效的函數。

如果你習慣計劃,其中一個函數調用的函數部分通常是評估,注意,這不能用Lisp相同方式工作,其中函數有不同的命名空間(查找f的功能插槽,而f的值通常是其值槽)。

如果要評估一個像普通值的功能,可以使用funcall or apply

(funcall (my-macro 2 3) 1) 
+0

感謝您的解釋。 – user328148

0

由於錯誤信息表明,在評估表格((my-macro 2 3) 1)時,Emacs在評估列表之前並未展開(my-macro 2 3)這是第一個元素。你想說

(funcall (my-macro 2 3) 1) 

(eval (list (my-macro 2 3) 1) 

或類似的東西,使宏被評估。

+0

很酷。奇蹟般有效。 – user328148

相關問題