我试图了解 car 和 cdr 的多个调用如何协同工作。例如,下面的例子看起来很简单:
(car (cdr '(car (cdr (1 2 3))))
我的 DrRacket 编译器'(cdr (1 2 3))
在运行时输出,但我不知道如何。不应该先取 (1 2 3) 的 cdr 吗?前两辆车和cdr呢?
不,quote 运算符将引用它后面的所有表单和子表单。只执行列表的第一个 car 和 cdr;首先(cdr '(car (cdr (1 2 3)))
-> '((cdr (1 2 3))
,然后(car '((cdr (1 2 3)))
-> '(cdr (1 2 3))
。
这里的问题是“报价”比你想象的要强大得多。特别是,引用是对“读者”的指令——检查你的程序的第一段代码——重写你的程序
(car (cdr '(car (cdr (1 2 3))))
...进入
(car (cdr (list (quote car) (list (quote cdr) (list 1 2 3))))
也就是说,quote 向下流动并将每个左括号更改为新的列表创建,并将每个标识符更改为带引号的符号。
将引号应用于标识符以外的事物(例如,'abc
)是一个相当模糊的概念,通常在您对列表有很多经验并且正在寻找一种缩写它们的好方法之后更有意义。