【发布时间】: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