在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)
但它不起作用
以下为什么不工作?
(apply and (list #t #t #f))
Run Code Online (Sandbox Code Playgroud)
虽然以下工作正常.
(apply + (list 1 3 2))
Run Code Online (Sandbox Code Playgroud)
这似乎是R5RS和R6RS的情况?