我是一名初学者计划程序员,我希望丰富我在函数式编程方面的知识。我在DrRacket IDE中编程。最近我发现了一些有趣的代码:
(car ''(a b))
输出:
'quote
任何人都可以解释我为什么以这种方式进行评估?
答案 0 :(得分:6)
这是因为'
是(quote ...)
的缩写。所以,
(car ''(a b))
实际上是
(car (quote (quote (a b))))
评估为:
'quote
正如Josh在评论中所指出的那样,实际结果只是quote
并且REPL打印的表达式在这种情况下可以评估为quote
'quote
或者是相同的如上所示(quote quote)
。
答案 1 :(得分:5)
请注意,'x
(对于任何表达式x
)只是(quote x)
的简写,所以此代码:
(car ''(a b))
相当于这一个:
(car (quote (quote (a b))))
现在很容易看出您正在评估列表中的car
,如下所示:
'(quote (a b))
对此进行评估:
(list 'quote (list 'a 'b))
如果我们采用上述行的car
,我们将获得符号quote
,这正是您看到的结果。
答案 2 :(得分:-2)
它没有!
(car ''(a b))
哪个是
(car (quote (quote (a b))))
car
会对#<procedure:car>
进行评估,并且因为它会在申请之前对每个参数进行一次进行评估。
(quote (quote (a b))) ; ==> (quote (a b))
现在#<procedure:car>
的{{1}}为(quote (a b))
。它不是quote
。我可以证明这一点。请尝试将其包裹在'quote
中,如下所示:display
。输出只是(display (car ''(a b)))
那你为什么在球拍互动窗口看到quote
?
Racket有一项功能,您可以调整在程序未明确打印的表达式结果时数据的显示方式。标准取决于所选择的语言,#!为了不按原样显示数据,但是你可以评估并成为数据的东西。在REPL中,您可以评估输出并获得相同的效果,因为该模式有效。
如果您在左下方选择选择语言并按显示详细信息,则可以更改行为。部件输出语法允许您从4种方式中选择&#34;显示结果&#34;在交互窗口中。 print 是默认语言, write 与您'quote
数据时的结果相同,并且与大多数Scheme书籍的预期相同。