在scheme中的scheme解释器中,如何实现';引用';?

在scheme中的scheme解释器中,如何实现';引用';?,scheme,racket,interpreter,quote,Scheme,Racket,Interpreter,Quote,我正在用scheme(哦,Racket)编写一个scheme解释器。在我的parse/eval函数中,我有以下规则: (quotation [(Q datum) (string->symbol $2)]) 在这样的解释器中,string->symbol显然是对quote的错误定义 我尝试过许多其他的方法,但都不管用。当然,如果我尝试使用Racketquote函数,它就不起作用了,因为$2是按字面意思解释的,所以所有的计算结果都是$2 现在,如果我在REPL上评估一些示例: $> (

我正在用scheme(哦,Racket)编写一个scheme解释器。在我的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
与球拍回复:

$> (eval '1)
$> 1
$> (eval '#f)
$> #f
$> (eval 's)
$> 's
注意区别:(eval)->s在我的球拍中,->在球拍中。此外,执行
(符号?(eval x))
的行为也不同


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

如评论所述,这是REPL打印的一个问题,正确的实施方式是:

(quotation [(Q datum) $2])

感谢那些帮助我的人

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