在Clojure中,我可以定义一个函数序列,然后像调用其他值一样调用它们,如下所示:
(doseq [op [+ - * /]]
(println (op 1 2 3 4)))它产生以下输出:
10
-8
24
1/24
nil试图在公共Lisp中执行同样的操作只会导致错误:
(dolist (op '(+ - * /))
(print (op 1 2 3 4))
; in: DOLIST (OP '(+ - * /))
; (LET ((OP (TRULY-THE (MEMBER / * - +) (CAR #:N-LIST671))))
; (SETQ #:N-LIST671 (CDR #:N-LIST671))
; (TAGBODY (PRINT (OP 1 2 3 4))))
;
; caught STYLE-WARNING:
; The variable OP is defined but never used.
; in: DOLIST (OP '(+ - * /))
; (OP 1 2 3 4)
;
; caught STYLE-WARNING:
; undefined function: OP
;
; compilation unit finished
; Undefined function:
; OP
; caught 2 STYLE-WARNING conditions
debugger invoked on a UNDEFINED-FUNCTION:
The function COMMON-LISP-USER::OP is undefined.
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
("undefined function")打电话给op作为#'op也不适合我。
那么,在CL中有办法做到这一点吗?
发布于 2014-10-03 16:45:25
由于函数的命名空间和数据的命名空间在LISP-2中是分开的(因此在公共-lisp中),所以在将函数作为参数传递时需要使用funcall:
(dolist (op '(+ - * /))
(print (funcall op 1 2 3 4))))funcall函数大致相当于Clojure的apply,并将op函数应用于提供的参数。在本例中,还有一件事正在进行,因为op是一个绑定到函数的符号,但是funcall会处理这个问题。
https://stackoverflow.com/questions/26182908
复制相似问题