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

如何在LISP中将算术运算符作为函数参数传递?,lisp,common-lisp,Lisp,Common Lisp,例如,我想定义这样一个函数: (defun operation (op) (op 3 7)) (defun operation (op) (apply op '(3 7))) (operation #'+) 但是lisp编译器抱怨这样的代码:(操作+ 有没有办法将算术运算符作为函数参数传递?有两类Lisp方言:Lisp-1和Lisp-2。Lisp-1意味着函数和变量共享一个名称空间。Scheme是一个Lisp-1。Lisp-2意味着函数和变量具有不同的名称空间。公共Lisp是一个L

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

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

(operation #'+)
但是lisp编译器抱怨这样的代码:
(操作+


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

有两类Lisp方言:Lisp-1和Lisp-2。Lisp-1意味着函数和变量共享一个名称空间。Scheme是一个Lisp-1。Lisp-2意味着函数和变量具有不同的名称空间。公共Lisp是一个Lisp-2。如果要将名为
a
的函数作为参数传递给另一个函数,则必须将其称为
#a
。如果变量中存储了函数,则可以使用
apply
函数执行该函数。如果将代码重写为以下格式,则代码应该可以工作:

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

(operation #'+)

还有一个
funcall
函数类似于
apply
,但是参数被扩展而不是收集到列表中,因此
(apply op'(3 7))
也可以写成
(funcall op 3 7)
。有关何时使用的更多信息,请参阅(这实际上不是一个很好的重复,但更好的答案将是这个问题的一个好答案。)