我正在尝试测试racket中编译器的标记器/解析器组合,并且我有一个函数parse-string,契约类型类似于(-> string? ast:IntExp) (我知道,我可能应该重命名我的结构,但我在那里试验了一小段时间。不管怎样,我有一个测试库,上面写着(check-equal? (parse-string "4") (ast:IntExp 4))之类的东西,而且所有的测试都失败了,尽管在手动检查时,它们看起来应该通过。我的所有结构都是用define-struct/contract定义的,它们都被标记为#:transparent。这里出什么问题了?
好吧,很抱歉没有包括足够的资料来帮助我们:
以下是IntExp的结构定义:(define-struct/contract (IntExp Exp) ([val integer?]) #:transparent),这是测试:(check-equal? (parse-string "4") (ast:IntExp 4)),这是抱怨rackunit返回的内容:
-------------------- FAILURE actual: #(struct:IntExp ... 4) expected: #(struct:IntExp ... 4) name: check-equal? location: (#<path:/Users/clem/dev/tiger/parser-lexer-tests.rkt> 8 0 139 48) expression: (check-equal? (parse-string "4") (ast:IntExp 4)),以防万一,这里是我require的依赖项:
(require "lexer.rkt" "parser.rkt" parser-tools/lex (prefix-in ast: "ast.rkt") rackunit)
实际的解析器代码有点大,我有一种预感它不是问题的根源,因为我的所有测试都是这样失败的(经过检查,结果似乎是正确的)。我打赌我正在做一些很愚蠢的事。
发布于 2014-10-18 16:26:57
因为从不透明的结构类型继承的结构,球拍使用的是引用相等。根据医生们,要么使不透明父结构透明,要么添加比较底层结构的equal?-recur方法。
https://stackoverflow.com/questions/26205442
复制相似问题