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

Lisp expression evaluated to a list, not understanding how it works

我的老师很不善于解释。他只是给了我们一个问题和一个他无法解释的答案,导致我对它的了解不多。

有谁能分析一下这个答案是怎么来的吗? 我知道 car returns 列表的第一个元素和 cdr returns 第一个元素之后的所有元素。

提前感谢阅读。

Suppose the Lisp variable E has been given a value as follows:

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

Write a LISP expression which doesn't involve any numbers, but which evaluates to the list:

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

Answer:

(list (cadar e) (cadr (caadr e)) (cdaddr e))

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

也就是说,(caar x)相当于(car (car x))(caddr x)相当于(car (cdr (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))))

所以(list (cadar e) (cadr (caadr e)) (cdaddr e))等同于:

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

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