Clojure 在公共Lisp中调用函数列表
在Clojure中,我可以定义一系列函数,然后像调用任何其他值一样调用它们,如下所示:Clojure 在公共Lisp中调用函数列表,clojure,common-lisp,lisp-2,Clojure,Common Lisp,Lisp 2,在Clojure中,我可以定义一系列函数,然后像调用任何其他值一样调用它们,如下所示: (doseq[op[+-*/]] (普林顿(作品1234)) 将生成以下输出: 10 -8 24 1/24 nil 尝试在Common Lisp中执行相同操作只会导致错误: (dolist(op'(+-*/) (印刷品(作品1234)) ;in:DOLIST(OP'(+-*/) (LET((OP(really-THE(MEMBER/*-+)(CAR#:N-LIST671))) (SETQ#:N-LIS
(doseq[op[+-*/]]
(普林顿(作品1234))
将生成以下输出:
10
-8
24
1/24
nil
尝试在Common Lisp中执行相同操作只会导致错误:
(dolist(op'(+-*/)
(印刷品(作品1234))
;in:DOLIST(OP'(+-*/)
(LET((OP(really-THE(MEMBER/*-+)(CAR#:N-LIST671)))
(SETQ#:N-LIST671(CDR#:N-LIST671))
(印刷体(作品1234)))
;
;警告:
;定义了变量OP,但从未使用过。
;in:DOLIST(OP'(+-*/)
(作品1234)
;
;警告:
;未定义的函数:OP
;
;编译单元已完成
;未定义的功能:
;OP
;捕捉到2种类型的警告条件
在未定义的函数上调用调试器:
函数COMMON-LISP-USER::OP未定义。
键入“帮助”以获取调试器帮助,或键入(SB-EXT:EXIT)以退出SBCL。
重新启动(可通过数字或可能的缩写名称调用):
0:[中止]退出调试器,返回顶层。
(“未定义函数”)
作为#op
调用op
对我来说也不起作用
那么在CL中有没有这样做的方法?因为函数的名称空间和数据的名称空间在LISP-2中是分开的(因此在公共LISP中也是分开的),所以在将函数作为参数传递时需要使用
funcall
:
(dolist (op '(+ - * /))
(print (funcall op 1 2 3 4))))
funcall
函数大致相当于Clojure的apply
,将op
函数应用于提供的参数。在这种情况下,还有一件事要做,因为op
是绑定到函数的符号,但是funcall
会处理这个问题。请看一看