我正在尝试为球拍中的编译器测试令牌生成器/解析器组合,并且我有一个函数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))
这是投诉机架返回的信息:--------------------FAILUREactual: #(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)
实际的解析器代码有点大,我直觉这不是问题的根源,因为我的所有测试都以这种方式失败(经过检查,结果似乎是正确的)。我敢打赌,我在机架单元上做的事情很愚蠢。
最佳答案
Racket之所以使用引用相等,是因为所讨论的结构继承自不透明的struct-type。按照the docs,要么使不透明的父结构透明,要么添加一个equal?-recur
方法,用于比较基础结构。