这一短串cdr / car命令的输出是什么?

时间:2012-05-08 19:47:06

标签: scheme racket

我试图了解汽车和cdr的多次调用是如何协同工作的。例如,以下示例似乎很简单:

(car (cdr '(car (cdr (1 2 3))))

我的DrRacket编译器在运行时输出'(cdr (1 2 3)),但我不知道如何。不应该先取(1 2 3)cdr吗?前两辆车和cdr怎么样?

2 个答案:

答案 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)是一个相当滑的概念,通常在您有很多列表经验之后会更有意义,并且正在寻找一种很好的缩写方法。