这个问题已经在这里有一个答案:
- 是否有任何的Lisp具有s表达式作为他们的头,例如,获得((R 2)3 4)? 如果不是,为什么? 3个回答
- 为什么我们需要在Lisp中funcall? 3个回答
我试图用一个函数返回Common Lisp中的功能。 不过,我碰到一个奇怪的现象,我想解释。
这就是我想做的事:
(defun makefun(x) ;1
(lambda (z)
(+ x z)))
((makefun 1) 2) ;2
这导致非法函数调用。 然而,以下是有效的:
((lambda (z) (+ 1 z)) 2) ;3
(funcall (makefun 1) 2) ;4
我为什么不能使用makefun作为第一个例子吗? 我期望在2调用进行评价,这将是相当于3行。
如果回答过类似的问题已经#2。 这是一个重复的。 需要找到它。
无论如何。
(defun makefun(x) ;1
(lambda (z)
(+ x z)))
((makefun 1) 2)
Common Lisp中不允许的功能定位评估。 它要求你把一个符号或一个实际的lambda表达式存在。
请记住:Common Lisp的具有独立功能的命名空间 。 该值命名空间是不同的。 这里MAKEFUN
返回一个值,这个值是不是在函数命名空间可用。
只有两种语法的方式来调用一个函数:
(foo 1 2)
和
((lambda (a b) (list a b)) 1 2)
见CLHS(conses之外的形式) 。 在这里,我们有一个lambda形式 。
增加的能力,写((some-function-returning-function) 1 2)
将使Common Lisp中的函数调用更加混乱:
-
(foo 1 2)
将使用的函数命名空间 -
((some-function-returning-function) 1 2)
将使用的值的命名空间
常见Lisp有几种不同的命名空间 ,并且在函数形式 ,该函数值 ,使用操作者的。 你lambda
例如工作,因为拉姆达形式是在评价规则的独立分支。 您只需谷歌为“Common Lisp的命名空间”,“Lisp的1比Lisp的-2”的更多细节,以及这里有相当多的问题和答案在SO覆盖这些主题。
但是,回答特定的问题,使用funcall
(你也可以看一看apply
):
(funcall (makefun 1) 2)