Racket哈希等式

时间:2013-04-29 17:06:15

标签: unit-testing lisp racket

我一直在玩Racket和Rackunit。我正在将我的小静态站点生成器移植到Racket并编写单元测试并遇到这个奇怪的问题。

#lang racket
(require (planet esilkensen/yaml:2:1))
(require rackunit)

(define some-yaml 
  (string->yaml " - name : ding"))

(check-equal? some-yaml '(#hash(("name" . "ding"))) )

有人可以向我解释为什么测试失败并输出以下内容:

Welcome to DrRacket, version 5.3.3 [3m].
Language: racket; memory limit: 128 MB.
--------------------
FAILURE
name:       check-equal?
location:   (#<path:/home/ding/Documents/racket/blog-generator> 7 0 119 45)
expression: (check-equal? x '(#hash(("name" . "ding"))))
actual:     (#hash(("name" . "ding")))
expected:   (#hash(("name" . "ding")))

3 个答案:

答案 0 :(得分:4)

源代码中的

'#hash(...)被读作不可变的哈希,但看起来这个库产生了一个可变的哈希。 (不幸的是,它们的印刷都是一样的。)

答案 1 :(得分:4)

它与可变与不可变哈希有关。以下测试将通过:

(check-equal? some-yaml (list (make-hash '(("name" . "ding")))))

其中make-hash是可变的哈希构造函数。

正如Eli所说,令人困惑的是,可变和不可变的哈希以相同的方式打印,所以我报告了一个错误。

答案 2 :(得分:3)

我的猜测是string->yaml的结果是 mutable 哈希,它永远不会等于 immutable 哈希(参见the docs