球拍合同失败的地方不应该

时间:2013-10-29 20:50:02

标签: lisp racket contract

我有一个表示移动的结构

(struct move (tile x y rotations) #:prefab)

也允许通过,所以我有一个bool来测试一个动作:

(define (action? v)
  (if (or (pass? v)
          (move? v))
      #t
      ;; else
      #f
  )
)

我可以宣布像

这样的举动
(define test (move (tile 'blue (list (posn 0 0 ) (posn 1 0) (posn 2 0) (posn 3 0) (posn 3 1))) 2 4 0))

当我测试行动时?它通过了:

  

(行动?测试)       #T

但是,当我在另一个模块上使用此文件时,移动结构不被视为有效移动:

  

州 - 过渡:合同违规    预期:(和/ c动作????)    给定:'#s(移动#s(瓦片蓝色(#s(posn 0 0)#s(posn 1 0)#s(posn 2 0)#s(posn 3 0)#s(posn 3 1))) 2 4 0)    这不是:???

以下是教师提供的州过渡合同:

[state-transition (->i ([s state?]
          [a (s) (and/c action?
                (cut state-action-legal? <> s))])
         [result state?])] 

所以我在两个地方基本上有相同的对象。在其中一个中它通过了测试,在另一个中它失败并且合同被破坏了。为什么会这样?

修改

以下是state-action-legal的定义?

(define (state-action-legal? state action)
  (not (state-action-violation state action))
)

状态操作违规会返回表示操作不合法的字符串,如果操作合法则返回#F。我知道他们都正常工作,因为我们手动测试它们,老师提供单元测试以确保正确实施,这些功能通过所有这些。

结束修改

感谢您的帮助。

0 个答案:

没有答案