gpt4 book ai didi

clojure - 在 Common Lisp 中调用函数列表

转载 作者:行者123 更新时间:2023-12-03 21:44:46 26 4
gpt4 key购买 nike

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

(doseq [op [+ - * /]]
(println (op 1 2 3 4)))

产生以下输出:

10
-8
24
1/24
nil

尝试在 Common 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 中有没有办法做到这一点?

最佳答案

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

(dolist (op '(+ - * /)) 
(print (funcall op 1 2 3 4))))

funcall 函数大致相当于 Clojure 的 apply,并将 op 函数应用于提供的参数。在这种情况下,还有一件事正在发生,因为 op 是一个绑定(bind)到函数的符号,但 funcall 会处理它。

关于clojure - 在 Common Lisp 中调用函数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com