为什么(汽车'(a b))评价引用?

时间:2014-06-09 02:32:20

标签: functional-programming scheme racket

我是一名初学者计划程序员,我希望丰富我在函数式编程方面的知识。我在DrRacket IDE中编程。最近我发现了一些有趣的代码:

  (car ''(a b))

输出:

  'quote

任何人都可以解释我为什么以这种方式进行评估?

3 个答案:

答案 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书籍的预期相同。