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 语言)中,函数如 cadar
或 cdaddr
等(您最多可以有 4 个字符 d
或 a
在第一个 c
之后和最后一个 r
之前)是函数 car
和 cdr
组合的缩写,规则如下:每个 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)))))
产生了预期的结果(您可以通过按正确顺序应用所有函数来验证这一点)。
我的老师很不善于解释。他只是给了我们一个问题和一个他无法解释的答案,导致我对它的了解不多。
有谁能分析一下这个答案是怎么来的吗?
我知道 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 语言)中,函数如 cadar
或 cdaddr
等(您最多可以有 4 个字符 d
或 a
在第一个 c
之后和最后一个 r
之前)是函数 car
和 cdr
组合的缩写,规则如下:每个 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)))))
产生了预期的结果(您可以通过按正确顺序应用所有函数来验证这一点)。