我习惯(quote x)
评估x
,(quote (x y z))
评估为(x y z)
,(car (quote (x y z))
评估为x
。推理很简单:quote是一种特殊的形式,它不会评估它的参数,而只是按原样返回它。
我刚刚开始使用Racket,它认为(quote x)
评估为(quote x)
,(quote (x y z))
评估为(quote (x y z))
,而(car (quote (x y z))
评估为{{1} }}。
嗯,实际上,它分别打印为(quote x)
,'x
和'(x y z)
,但这是相同的。
有人能在这里解释一下推理吗?如果由于某种原因,'x
评估为(quote (x y z))
,那么那辆汽车不应该是(quote (x y z))
吗? quote
来自哪里?
据我所知,在整个计算过程中,Racket的内部行为与我习惯的一样,只是当需要打印最终结果时,它会以报价形式包装它。这在所有情况下都是正确的吗?如果是这样,为什么要这样做呢?
答案 0 :(得分:3)
Racket以与任何Scheme相同的方式评估表达式。然而,球拍在教学语言中有一位特殊的作家。在DrRacket中,您可以更改值的打印方式。在语言菜单中,单击高级按钮,然后查看打印选项。
答案 1 :(得分:0)
球拍(语言)打印出顶级表单的结果,不仅在交互窗口(REPL)中输入,而且始终打印出来。这是为了简化开发我想在现实世界的应用程序中你没有任何东西的语句,所以真正的应用程序不会显示这些行,因为你有define
和一个表达式来启动你的程序并且你可以从它返回(void)以强制没有输出..
如果您要将语言更改为#!r6rs
或#!r5rs
,您很快就会发现,如果您明确使用了{{1},那么在定义窗口中获取评估结果的唯一方法就是结果。
无论使用何种语言,display
都会正确显示。对于REPL打印,语言和设置控制它的显示方式。标准#!racket将以这样的方式显示,即将它放在一个用display
包裹的新表达式中,其打印方式与使用display将原始表达式包装完全相同。
display