2014-10-05 51 views
0

我试图测试一个编译器在球拍中的标记器/解析器组合,并且我有一个函数parse-string,契约类型为(-> string? ast:IntExp)(我知道,我应该重命名我的但我正在试验打字球拍一小会儿 无论如何,我有一个测试银行写了 (check-equal? (parse-string "4") (ast:IntExp 4))这样的东西,所有的测试都失败了,即使经过人工检查,他们看起来应该是他们应该通过我所有的结构都与define-struct/contract定义,所有的人都标志着#:transparent。 什么事错在这里?Rackunit等式检查结构

好了,对不起,不包括enoug氢源是有帮助的:

下面是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 ING:

(require "lexer.rkt" "parser.rkt" parser-tools/lex (prefix-in ast: "ast.rkt") rackunit)

实际解析器代码是一种我觉得这不是问题的根源,因为我的所有测试都是以这种方式失败的(检查结果看起来是正确的)。我敢打赌,我在rackunit中做了一件非常愚蠢的事情。

+0

因此,你有一个过程'parse-string',它的结果是一个结构,而另一个结构的版本是用'parse-string'使用的相同的值初始化的,你会得到'#f'作为'check-equal?'它们之间?如果您需要更多帮助,我认为您需要提供更多代码。 – Sylwester 2014-10-05 20:43:00

回答

0

球拍正在使用引用相等,因为所涉及的结构从不透明的结构类型继承。根据the docs,要么使不透明的父结构透明,要么添加一个比较底层结构的方法。