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
前面,反之亦然。如果可能的话,请你把第二项的内容像第一项那样写出来好吗?如果我要求太多,先生,我深表歉意。