Lisp表达式被评估为一个列表,而不是理解它是如何工作的

问题描述 投票:0回答:1

我的老师很难解释。他给了我们一个问题,答案是他无法解释,导致我自己不了解太多。

是否有人可以分解这个答案是如何产生的?据我所知,car返回列表的第一个元素,cdr返回第一个元素后的所有元素。

提前感谢您的阅读。

假设Lisp变量E的值如下:

(setf e '((-1 -2)
          ((90 91) 92 93 94 95 96 97 98)
          (9 19 29 39 49 59 69 79 89)))

编写一个LISP表达式,该表达式不涉及任何数字,但会对列表求值:

(-2 91 (19 29 39 49 59 69 79 89))

回答:

(list (cadar e) (cadr (caadr e)) (cdaddr e))
lisp elisp
1个回答
3
投票

在Common Lisp(以及其他Lisp语言)中,像cadarcdaddr等函数(在第一个d之后和最后一个a之前,你最多可以有4个字符cr)是car函数组合的缩写和cdr有以下规则:每个a对应一个car,每个d对应一个cdr

换句话说,(caar x)相当于(car (car x))(caddr x)相当于(car (cdr (cdr x)))等等。

例如,在你的例子中,qazxsw poi意味着qazxsw poi,即:

(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))))

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

© www.soinside.com 2019 - 2024. All rights reserved.