不能使用函数调用作为S-EXP [复制]第一个参数(Cannot use function call

2019-07-17 23:10发布

这个问题已经在这里有一个答案:

  • 是否有任何的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行。

Answer 1:

如果回答过类似的问题已经#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)将使用的值的命名空间


Answer 2:

常见Lisp有几种不同的命名空间 ,并且在函数形式 ,该函数值 ,使用操作者的。 你lambda例如工作,因为拉姆达形式是在评价规则的独立分支。 您只需谷歌为“Common Lisp的命名空间”,“Lisp的1比Lisp的-2”的更多细节,以及这里有相当多的问题和答案在SO覆盖这些主题。

但是,回答特定的问题,使用funcall (你也可以看一看apply ):

(funcall (makefun 1) 2)


文章来源: Cannot use function call as first argument in s-exp [duplicate]