相关疑难解决方法(0)

如何将"或"应用于elisp中的列表

在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)

但它不起作用

lisp elisp

21
推荐指数
2
解决办法
2801
查看次数

将列表传递给Common Lisp中的宏

我在将列表传递到宏时遇到问题,该列表将用于生成函数名称。例如,下面的代码将导致错误。

(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)

lisp macros metaprogramming common-lisp quote

2
推荐指数
1
解决办法
56
查看次数

标签 统计

lisp ×2

common-lisp ×1

elisp ×1

macros ×1

metaprogramming ×1

quote ×1