Lisp表达式计算为列表,不了解其工作原理

Lisp表达式计算为列表,不了解其工作原理,lisp,elisp,Lisp,Elisp,我的老师不善于解释。他只是给了我们一个他无法解释的问题的答案,这导致我自己不太理解 有没有人可以详细说明这个答案是如何产生的? 我知道car返回列表的第一个元素,cdr返回第一个元素之后的所有元素 提前感谢您的阅读 假设Lisp变量E的值如下所示: 编写一个LISP表达式,该表达式不涉及任何数字,但计算结果如下: 答复: 在通用Lisp(以及其他Lisp语言)中,一个函数,如cadar或cdaddr等(在第一个c之后和最后一个r之前,最多可以有4个字符d或a)是具有以下规则的car和cdr功能组

我的老师不善于解释。他只是给了我们一个他无法解释的问题的答案,这导致我自己不太理解

有没有人可以详细说明这个答案是如何产生的? 我知道
car
返回列表的第一个元素,
cdr
返回第一个元素之后的所有元素

提前感谢您的阅读

假设Lisp变量E的值如下所示:

编写一个LISP表达式,该表达式不涉及任何数字,但计算结果如下:

答复:

在通用Lisp(以及其他Lisp语言)中,一个函数,如
cadar
cdaddr
等(在第一个
c
之后和最后一个
r
之前,最多可以有4个字符
d
a
)是具有以下规则的
car
cdr
功能组合的缩写:每个
a
对应于
car
,每个
d
对应于
cdr

换句话说,
(caar x)
相当于
(car(car x))
(caddr x)
相当于
(car(cdr x))
,依此类推

因此,对于距离,在您的示例中,
(cadar e)
表示
(car(cdr(car e)))
,即:

take the (car e), which is (-1 -2)
take the cdr of the previous value, which is the list (-2)
take the car of this list, that is the integer -2
以下是其他等价物:

(cadr (caadr e)) = (car (cdr (car (car (cdr e)))))
(cdaddr e) = (cdr (car (cdr (cdr e))))
因此
(列表(cadar e)(cadr(caadr e))(cdaddr e))
相当于:

(list (car (cdr (car e)))
      (car (cdr (car (car (cdr e)))))
      (cdr (car (cdr (cdr e)))))
这将产生预期的结果(您可以通过按正确的顺序应用所有函数来验证这一点)。

在通用Lisp(以及其他Lisp语言)中,使用类似于
cadar
cdaddr
等的函数。(在第一个
c
之后和最后一个
r
之前,最多可以有4个字符
d
a
)是具有以下规则的
car
cdr
功能组合的缩写:每个
a
对应于
car
,每个
d
对应于
cdr

换句话说,
(caar x)
相当于
(car(car x))
(caddr x)
相当于
(car(cdr x))
,依此类推

因此,对于距离,在您的示例中,
(cadar e)
表示
(car(cdr(car e)))
,即:

take the (car e), which is (-1 -2)
take the cdr of the previous value, which is the list (-2)
take the car of this list, that is the integer -2
以下是其他等价物:

(cadr (caadr e)) = (car (cdr (car (car (cdr e)))))
(cdaddr e) = (cdr (car (cdr (cdr e))))
因此
(列表(cadar e)(cadr(caadr e))(cdaddr e))
相当于:

(list (car (cdr (car e)))
      (car (cdr (car (car (cdr e)))))
      (cdr (car (cdr (cdr e)))))

这会产生预期的结果(您可以通过按正确的顺序应用所有函数来验证)。

初始列表不平衡--
98
后面的右括号关闭整个列表。我已修复了列表,以便(a)它是平衡的,以及(b)给定的解决方案是有效的。初始列表是不平衡的,
98
后面的右括号关闭整个列表。我已经修复了列表,以便(a)它是平衡的,并且(b)给定的解决方案是有效的。啊,我现在明白了!我得到了
(cadar e)
部分,但由于某种原因,我无法回过头来
(cadr(caadr e))
(cdaddr e)
部分。我试着按照您提到的方式将其分解,但由于某种原因,它没有点击:(.obsolutemal:我刚刚修复了问题列表。让您困惑的部分现在可能更有意义了?例如,生成第二项的顺序是:
(-1-2)((90 91)92 93…)(9 19…)
cdr是
((90 91)92 93…(9 19…))
汽车是
((90 91)92 93…)
汽车是
(90 91)
cdr是
(91)
汽车是
91
嗯,我现在有点明白了。我有点困惑于如何知道什么时候把
a
放在
d
前面,反之亦然。如果可能的话,你可以像第一项那样写出整个第二项吗?如果我要求太多,先生,我很抱歉。啊,我现在明白了!我明白了
(卡达尔e)
部分但由于某些原因,我无法将我的头绕到
(cadr(caadr e))
(cdaddr e)
部分。我尝试按照您提到的方式对其进行分解,但由于某些原因,它没有点击:(.obsolutemal:我刚从问题中修正了这个列表。让你困惑的部分现在可能更有意义了?例如,产生第二项的顺序是:
(-1-2)((90 91)92 93…(9 19…))
cdr is
((90 91)92 93…(9 19…)
car is
((90 91)92 93…)
car is
(90 91)
cdr是
(91)
汽车是
91
嗯,我现在有点明白了。我有点困惑,不知如何知道什么时候把
a
放在
d
前面,反之亦然。如果可能的话,请你把第二项的内容像第一项那样写出来好吗?如果我要求太多,先生,我深表歉意。