【问题标题】:behavior of quote in racket球拍中报价的行为
【发布时间】:2014-02-19 10:13:14
【问题描述】:

我习惯于将(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)) 的计算结果为 (quote x)。

实际上,它会将它们分别打印为'x、'(x y z) 和'x,但这是同一回事。

有人可以解释这里的原因吗?如果出于某种原因,(quote (x y z)) 的计算结果为(quote (x y z)),那么那辆车不应该是quote 吗? (quote x)来自哪里?

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

【问题讨论】:

  • 请参阅我在 this answer 中的注释:“作为额外的复杂情况,某些系统(我正在考虑某些语言,尤其是 Racket 博士)不会在交互式提示,而是打印一个会产生相同(对于“相同”的某些解释)值的表单。例如,您可以评估 '(1 . 2) 并查看输出 (cons 1 2) 因为那是另一个产生相同值的形式。”
  • Meaning of 'quote in Lisp的可能重复

标签: scheme racket quote repl-printed-representation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2014-11-22
      • 2013-03-03
      • 2021-02-07
      相关资源
      最近更新 更多