为何`(,x)`是`(cons x '())`的简写?相关衍生问题咨询
Lisp相关问题解答
1. (((pea)) ,q)的求值结果
首先要明确,你提到的(,x)作为(cons x '())的简写并非标准Common Lisp的语法,更可能是某个特定Lisp方言的约定或是对反引号(准引用)语法的误解。不过基于你给出的假设,我们可以推导:
假设(,x)等价于(cons x '()),且原表达式是带反引号的(因为,x是反引号专属语法,完整表达式应为`(((pea)) ,q)),那么求值过程如下:
- 反引号中未加逗号的部分
((pea))会被原样保留(作为引用的列表结构); ,q按照约定会被替换为(cons q '()),也就是(q);- 最终整个表达式的求值结果为
((pea) (q))。
如果是标准Common Lisp语法,`(((pea)) ,q)的求值结果是((pea) Q)(其中Q是变量q的实际值),因为,q的作用是直接插入q的值而非构造单元素列表。
2. 为什么pea被两组括号包裹?
((pea))是Lisp里的嵌套函数调用写法:
- 内层的
(pea)是调用pea(如果pea是函数,就执行它;如果是变量,就取它的值),若pea的返回结果是一个可调用的函数对象,那么这一步得到的就是一个函数; - 外层的
((pea))则是调用这个返回的函数(无参数调用)。
举个具体例子:
(defun pea () ;; 返回一个无参lambda函数 (lambda () "嵌套调用的结果")) ((pea)) ; 求值结果为"嵌套调用的结果"
内容的提问来源于stack exchange,提问作者Alper
相关产品推荐
相关产品推荐

