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 中语法不允许其他方式。