无法识别racket中的违反合同和结构错误

无法识别racket中的违反合同和结构错误,racket,Racket,我在追逐球拍的领域。下面的代码引发以下错误: coord-lat: contract violation expected: coord? given: #<void> coord-lat: contract violation expected: coord? given: #<void> in: the 1st argument of (-> coord? number?) contract from: (struct coord)

我在追逐球拍的领域。下面的代码引发以下错误:

coord-lat: contract violation
expected: coord?
given: #<void>
    coord-lat: contract violation
 expected: coord?
 given: #<void>
 in: the 1st argument of
      (-> coord? number?)
 contract from: (struct coord)
 blaming: fly-ufo.rkt
 at: fly-ufo.rkt
增加一个坐标?调试的pos条件确认坐标不是坐标。将当前状态定义为大爆炸函数之前的坐标(如下所示)也无法解决错误:

(define s (coord 0 0))

(big-bang s...
我检查了诈骗和文件,但找不到原因。由于许多示例都使用define struct,我也尝试了define struct并制作了coord,但这也没什么帮助。骗局文件也表明了这一点

向coord添加合同

(provide coord)
(define-struct/contract coord ([alt number?]
                               [lat number?])
  #:transparent
  #:mutable)
导致以下错误:

coord-lat: contract violation
expected: coord?
given: #<void>
    coord-lat: contract violation
 expected: coord?
 given: #<void>
 in: the 1st argument of
      (-> coord? number?)
 contract from: (struct coord)
 blaming: fly-ufo.rkt
 at: fly-ufo.rkt
它成功了

第二版 我把这个放在这里只是为了将来参考。在Metaxal指出应该创建一个新结构后,我更新了该结构,如下所示:

;; a struct for the current state, where:
;; field 1 is x coordinate
;; field 2 is y coordinate
;; field 3 is horizontal speed
;; field 4 is vertical speed
(struct cs (lat alt hspeed vspeed))
此后,阻止不明飞行物变得非常简单:

(define (stop ufo)
  (cs (cs-lat ufo) (cs-alt ufo) 0 0))
加速向上变成:

(define (up-wards ufo)
  (cond [(> (cs-vspeed ufo) (- MAX-SPEED))
         (struct-copy cs ufo [vspeed (sub1 (cs-vspeed ufo))])]
        [#t (play-sound some-sound-file #t)
            ufo]))

现在我唯一想知道的是,将播放声音文件和ufo放在else分支的级联中是否是命令式的。

通常,您会得到一个错误,如给定的:当一个函数应该返回一个值,但不返回时。例如,坏:

(define (increment x)
  (set! x (add1 x)))
;; set! returns void, therefore increment returns void
好与坏:

(define (increment x)
  (add1 x))
;; returns a number
虽然我不熟悉大爆炸,但看起来你也有类似的问题:

(define (increment pos)
  (set-coord-alt! pos (+ 2 (coord-alt pos)))
  (set-coord-lat! pos (+ 1 (coord-lat pos))))

  . . . .

(big-bang (coord 0 0)
          (on-tick increment)
          (to-draw move-ufo)
          (stop-when at-the-border))
看起来《大爆炸》中所有的on-tick子句变体都应该返回HandlerResult,而不是

资料来源:


什么是设置坐标alt!它返回了什么?

非常感谢,很抱歉耽搁了,我仔细研究了这些文件。请看编辑。简言之,当我在增量函数的末尾添加一个pos时,它起作用了。这确实起作用,但这不是用Racket和函数式语言做事情的首选方式。你应该删除结构定义中的:mutable关键字,而不是修改现有的pos,在你的增量函数中,你应该创建一个新的pos,这实际上比修改一个pos更简单。哦,我明白了,这就是破坏性的意思。我喜欢功能性的方式,并试图学习系统性的,但我很难弄清楚突变。谢谢你的提示。@Metaxal:我试图使用struct copy和一些begin语句创建一个新的pos,但没有成功。你能不能帮我找一份关于它的文档?对于这个简单的结构,你真的不需要结构副本。只需定义增量pos coord alt pos coord lat pos即可。但是如果你真的想用struct copy做实验,如果struct是复杂的,它确实会更好,我认为标准文档应该会有帮助,如果你还没有找到它们的话:我知道了,只要做一个协调。。。在函数内部定义。