在elisp我可以评估或作为一个函数就像+.
(or nil 0 nil) ==> 0
(+ 1 0 1) ==> 2
Run Code Online (Sandbox Code Playgroud)
我可以使用apply来将+应用到列表中
(apply '+ '(1 0 1)) ==> 2
Run Code Online (Sandbox Code Playgroud)
所以,我会想或者会以同样的方式工作,但事实并非如此.
(apply 'or '(nil 0 nil)) ==> error: (invalid-function or)
Run Code Online (Sandbox Code Playgroud)
我想这是来自用于实现短路评估的一些内部魔术.如何使用apply对列表执行或操作?
PS我想要的应用程序是找出命令行上的任何元素是否与特定模式匹配,所以我写的重要部分是:
(apply 'or (mapcar (lambda (x) (string-match-p "pattern" x)) command-line-args))
Run Code Online (Sandbox Code Playgroud)
但它不起作用
我在将列表传递到宏时遇到问题,该列表将用于生成函数名称。例如,下面的代码将导致错误。
(defmacro gen (str-lst)
`(defun ,(intern (string-upcase (car str-lst))) () (print "foo")))
(gen '("foo" "bar"))
Run Code Online (Sandbox Code Playgroud)
产生的错误是:
***-DEFUN / DEFMACRO:QUOTE是一种特殊的运算符,不能重新定义。可以使用以下重新启动:ABORT:R1
中止主循环
我应该如何修改我的代码,我的代码有什么问题?
令我更加困惑的是,下面的代码(有关答案在此处退出)的运行正常。
(defmacro easy-one (str-lst)
`(mapc #'(lambda (str) (print str)) ,str-lst))
(easy-one '("foo" "bar"))
Run Code Online (Sandbox Code Playgroud)