微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么elisp宏返回的功能的应用程序不起作用?

如何解决为什么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)
我想念什么?     

解决方法

        Emacs Lisp要求列表形式的第一个元素是内置函数(或subr),lambda表达式(即
(lambda LIST . LIST)
)或宏lambda表达式(即
(macro lambda LIST . LIST)
)。第一个元素也可以是符号,其功能插槽中包含一个有效的第一个元素。
(my-macro 2 3)
没有必需的格式,因此它是无效函数。 如果您习惯使用Scheme,在该函数中对函数调用的函数部分进行了正常评估,请注意,这在Lisp中不能完全相同,因为Lisp中的函数具有不同的命名空间(
(f 3)
查找
f
的函数槽,而“ѭ9”的值通常是其值槽)。 如果要评估正常值之类的函数,可以使用use11ѭ或
apply
(funcall (my-macro 2 3) 1)
    ,        正如错误消息所表明的那样,在评估形式“ 3”时,Emacs不会在评估列表的第一个元素之前扩展“ 1”。你想说
(funcall (my-macro 2 3) 1)
要么
(eval (list (my-macro 2 3) 1)
或类似的东西,以便对宏进行评估。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。