首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在通用Lisp中调用函数列表

在通用Lisp中调用函数列表
EN

Stack Overflow用户
提问于 2014-10-03 16:26:02
回答 1查看 538关注 0票数 3

在Clojure中,我可以定义一个函数序列,然后像调用其他值一样调用它们,如下所示:

代码语言:javascript
复制
(doseq [op [+ - * /]]
  (println (op 1 2 3 4)))

它产生以下输出:

代码语言:javascript
复制
10
-8
24
1/24
nil

试图在公共Lisp中执行同样的操作只会导致错误:

代码语言:javascript
复制
(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中有办法做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-03 16:45:25

由于函数的命名空间和数据的命名空间在LISP-2中是分开的(因此在公共-lisp中),所以在将函数作为参数传递时需要使用funcall

代码语言:javascript
复制
(dolist (op '(+ - * /)) 
   (print (funcall op 1 2 3 4))))

funcall函数大致相当于Clojure的apply,并将op函数应用于提供的参数。在本例中,还有一件事正在进行,因为op是一个绑定到函数的符号,但是funcall会处理这个问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26182908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档