如何在 LISP 中将算术运算符作为函数参数传递?

ria*_*mat 3 lisp common-lisp

例如,我想定义一个这样的函数:

(defun operation (op)
  (op 3 7))
Run Code Online (Sandbox Code Playgroud)

但是 lisp 编译器会抱怨这样的代码: (operation +)

有没有办法将算术运算符作为函数参数传递?

Nei*_*ter 5

Lisp 方言有两类:Lisp-1 和 Lisp-2。Lisp-1 意味着函数和变量共享一个命名空间。Scheme 是一个 Lisp-1。Lisp-2 意味着函数和变量有不同的命名空间。Common Lisp 是 Lisp-2。如果要将命名a为参数的函数传递给另一个函数,则必须将其引用为#'a. 如果您将函数存储在变量中,则可以使用该apply函数来执行它。如果这样重写,您的代码应该可以工作:

(defun operation (op)
  (apply op '(3 7)))

(operation #'+)
Run Code Online (Sandbox Code Playgroud)

  • 还有一个类似于 `apply` 的 `funcall` 函数,但是参数被扩展而不是收集到一个列表中,所以 `(apply op '(3 7))` 也可以写成 `(funcall op 3 7)`。 (4认同)
  • 有关何时使用 which 的更多信息,请参阅 [何时使用 APPLY 和何时使用 FUNCALL?](http://stackoverflow.com/q/3862394/1281433) (2认同)