1

我习惯于(quote x)评估 to x(quote (x y z))评估 to(x y z)(car (quote (x y z))评估 to x。推理很简单:quote 是一种特殊形式,它不评估其参数,而只是按原样返回它。

我刚开始使用 Racket,它认为(quote x)评估为(quote x)(quote (x y z))评估为(quote (x y z))(car (quote (x y z))评估为(quote x)

好吧,实际上,它分别将这些打印为'x'(x y z)'x,但这是同一回事。

有人可以在这里解释原因吗?如果由于某种原因(quote (x y z))评估为(quote (x y z)),那么那辆车不应该是quote吗?从哪里来(quote x)

据我所知,在整个计算过程中,Racket 的内部行为与我习惯的一样,只是在打印最终结果时,它会将其包装在报价形式中。这在所有情况下都正确吗?如果是这样,它为什么要这样做?

4

2 回答 2

3

Racket 以与任何 Scheme 相同的方式评估表达式。然而,球拍在教学语言方面有一位特殊的作家。在 DrRacket 中,您可以更改值的打印方式。在语言菜单中,单击高级按钮,然后查看打印选项。

于 2014-02-19T10:37:01.793 回答
0

Racket(语言)打印出顶级表单的结果,不仅在交互窗口(REPL)中输入时,而且总是如此。我想这是为了简化开发,在现实世界的应用程序中,你没有不构成任何东西的语句,所以真正的应用程序不会显示这些行,因为你有define一个表达式来启动你的程序,你可以返回( void) 从它强制没有输出..

如果您将语言更改为#!r6rs或者#!r5rs您很快就会发现,在定义窗口中获得评估结果的唯一方法是您display在结果上明确使用。

无论使用何种语言,display都能正确显示。对于 REPL 打印语言和设置控制它的显示方式。标准 #!racket 是以这样一种方式显示的,即将它放在一个用 包裹的新表达式中,display打印出来的效果与用 display 包裹原始表达式完全相同。

(define test 'hello-world)
(display test) ;; displays hello-world and not 'hello-world
test           ;; displays 'hello-world in #!racket, nothing in R6RS unless in interactions window
于 2014-02-20T17:35:29.307 回答