【问题标题】:In a scheme interpreter in scheme, how to implement 'quote'?在方案中的方案解释器中,如何实现“报价”?
【发布时间】:2018-06-09 09:52:26
【问题描述】:

我正在用方案(好吧,球拍)编写方案解释器。在我的 parse/eval 函数中,我有以下规则:

(quotation [(Q datum) (string->symbol $2)])

string->symbol 在这样的解释器中显然是对quote 的错误定义。

我尝试了许多其他方法,但都没有奏效。当然,如果我尝试使用 Racket quote 函数,它不起作用,因为 $2 是按字面解释的,所以一切都评估为 $2

现在,如果我在 REPL 评估一些示例:

$> (eval '1)
$> 1
$> (eval '#f)
$> #f
$> (eval 's)
$> s

VS。球拍 REPL:

$> (eval '1)
$> 1
$> (eval '#f)
$> #f
$> (eval 's)
$> 's

注意区别:我的 (eval 's) -> s,Racket 中的 -> 's。此外,(symbol? (eval x)) 的行为也有所不同。

在这种情况下我应该如何实现quote

【问题讨论】:

  • 你可以看看this answer关于报价的差异。
  • @Renzo 谢谢,虽然如果我明白你的意思,我应该写(quotation [(Q datum) $2]),不是吗?没有评估就返回。但是在 Racket (eval 's) 中返回 's,而如果我运行修改后的版本,我会得到 s。正如您在链接答案中所说,那个 DrRacket 只是让我感到困惑吗?
  • @Raoul 是的,这是正确的实现。不要使用 REPL 作为证明,因为它的值可视化不是结果本身,除非结果是自我评估的。您可以通过在左下角选择“从源代码确定语言”来关闭它,然后会出现一个模式。按“显示详细信息”并将write 设置为输出样式。现在您可以看到大多数 lisp 实现共享的值以及在大多数情况下可以使用的值。

标签: scheme racket interpreter quote


【解决方案1】:

所以正如 cmets 中所说,这是 REPL 打印的问题,正确的实现是:

(quotation [(Q datum) $2])

感谢帮助过我的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    相关资源
    最近更新 更多