gpt4 book ai didi

racket - 如何比较 Racket 中的语法对象?

转载 作者:行者123 更新时间:2023-12-05 00:46:50 25 4
gpt4 key购买 nike

我想比较两个语法对象的代码内容并忽略上下文之类的东西。将它们转换为基准是唯一的方法吗?像:

(equal? (syntax->datum #'(x+1)) (syntax->datum #'(x+1)))

最佳答案

如果您想比较两个对象而不解构它们,那么可以。

然而,这种方法的问题是它只比较两个语法对象的数据,并不会真正比较它们的绑定(bind)信息。

我听说过的类比(来自 Ryan Culpepper),这有点像拿两幅画,把它们的颜色抽干,然后看看它们是否相同。虽然它们在某些方面可能相似,但您会错过很多不同颜色的差异。

更好的方法(虽然它确实需要一些工作),是使用 syntax-e 将语法对象分解为更原始的语法对象列表,并执行此操作直到获得 identifiers (基本上是一个语法对象,其数据是一个符号),从那里,您通常可以使用 free-identifier=? (有时 bound-identifier=? 来查看每个标识符是否可以相互绑定(bind), identifier-binding 来比较模块级标识符。

没有一个简单的谓词来比较两个任意语法对象的原因是,通常,即使您只关心语法相等,也没有一个好的定义来说明什么使两段代码相等。例如,使用上面引用的函数不会跟踪语法对象中的内部绑定(bind),因此您仍然会获得对“相等”含义的非常严格的定义。也就是说,两个语法对象具有相同的结构,其标识符要么绑定(bind)到同一个模块,要么是free-identifier=?。 .

因此,在您使用此答案之前,我强烈建议您退后一步,确保这确实是您想要做的。千载难逢,但大多数时候你实际上是在尝试解决一个类似但更简单的问题。

关于racket - 如何比较 Racket 中的语法对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com