Common Lisp 使用单词形式来表示所有可以评估的东西。表格是_
- 像这样的符号
foo
- 复合形式,列表,见下文
- 或自评估对象(如数字、字符、数组、字符串……)。
复合形式是
- 一种特殊的形式
(<special-operator> ...)
- 像这样的lambda 形式
(lambda (...) ...)
- 宏形式
(<macroname> ...)
- 或函数形式
(<functionname> ...)
。
以上是一组复合形式。ANSI Common Lisp 规范没有提供添加新类型表单或不同语法的方法。形成函数喜欢EVAL
或COMPILE
接受的接口是不可扩展的。
所以像
(((lambda (foo)
(lambda (bar)
(list foo bar)))
1)
2)
不是有效的 Common Lisp。这在 Common Lisp 中没有意义:
( <not a lambda form,
not a special operator,
not a macro name
and not a function name>
2)
请注意,Common Lisp 允许lambda 形式、特殊运算符、宏名称和函数名称作为复合形式中的第一个元素。但它不允许变量,也不允许其他复合形式作为复合形式中的第一个元素。
意味着这在 Common Lisp 中没有意义:
( <a function form> 2)
因此((foo 1) 2)
or (((foo 1) 2) 3)
or or ((((foo 1) 2) 3) 4)
or(((((foo 1) 2) 3) 4) 5)
在 Common Lisp 中是不合法的。你明白了。要调用从函数调用返回的函数对象,我们必须使用(funcall (foo ...) ...)
. 这使得调用返回的函数对象不仅仅是((foo ...) ...)
.
让我们为这个功能点赞 Common Lisp 的设计者。否则我可能不得不查看可能有意义的代码
(((((((((((( .....
而且很难弄清楚它的作用。基本上那将是只写代码。
你的问题:
为什么我必须调用从另一个函数返回的函数?
简短的回答:因为在 Common Lisp 中语法不允许其他方式。