我试图了解汽车和cdr的多次调用是如何协同工作的。例如,以下示例似乎很简单:
(car (cdr '(car (cdr (1 2 3))))
我的DrRacket编译器在运行时输出'(cdr (1 2 3))
,但我不知道如何。不应该先取(1 2 3)cdr吗?前两辆车和cdr怎么样?
答案 0 :(得分:5)
不,引用运算符将引用其后的所有表单和子表单。只执行列表的第一辆汽车和cdr;第一个(cdr '(car (cdr (1 2 3)))
- > '((cdr (1 2 3))
,然后(car '((cdr (1 2 3)))
- > '(cdr (1 2 3))
。
答案 1 :(得分:3)
这里的问题是“引用”比你想象的要强大得多。特别是,引用是指向“读者”的指令 - 检查程序的第一段代码 - 从
重写程序(car (cdr '(car (cdr (1 2 3))))
...成
(car (cdr (list (quote car) (list (quote cdr) (list 1 2 3))))
也就是说,引用涓涓细流并将每个左边的paren更改为新的列表创建,并将每个标识符更改为带引号的符号。
将引号应用于除标识符之外的其他内容(例如'abc
)是一个相当滑的概念,通常在您有很多列表经验之后会更有意义,并且正在寻找一种很好的缩写方法。