我正在尝试为球拍中的编译器测试一个标记器/解析器组合,我有一个函数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)
实际的解析器代码有点大,我有一种预感,它不是问题的根源,因为我的所有测试都以这种方式失败(结果,经过检查,似乎是正确的)。我敢打赌,我在rackunit做了一件非常愚蠢的事。
答案 0 :(得分:2)
Racket使用引用相等,因为有问题的结构继承自不透明的struct-type。根据{{3}},要么使不透明的父结构透明,要么添加一个
equal?-recur
方法,用于比较基础结构。