Common Lisp中是否必须使用lambda符号?编译问题咨询
关于Common Lisp中省略lambda的问题
首先明确:Paul Graham在《ANSI Common Lisp》第二章的表述,其实是指函数对象的内部表示,而非允许你直接用((x) x)这样的形式定义匿名函数。
为什么((lambda (x) x) 1)能运行,而(((x) x) 1)不行?
- Common Lisp的求值规则要求:函数调用的第一个元素必须是可求值为函数对象的形式。
lambda表达式是显式声明匿名函数的语法,(lambda (x) x)会被求值为一个函数对象,随后这个对象被传入参数1调用,所以能正常运行。 - 而
((x) x)这种形式,求值器会把它当成普通列表处理:首先尝试求值第一个元素x,如果x没有绑定到任何函数,会直接报错;就算x绑定了函数,后面的x也不符合参数列表的语法——Common Lisp不会自动把((x) x)解析成lambda函数,必须用lambda关键字明确标记这是一个函数定义。
对原文表述的正确理解
Paul Graham说的“用列表来表示函数”,是指函数对象在Lisp内部可以用类似(lambda (x) x)这样的列表结构存储,而不是说你可以省略lambda关键字直接写参数列表加函数体。在代码中,必须显式使用lambda才能创建匿名函数,这是Common Lisp的语法要求。
内容的提问来源于stack exchange,提问作者CREIGHT888
相关产品推荐
相关产品推荐

