无法识别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是复杂的,它确实会更好,我认为标准文档应该会有帮助,如果你还没有找到它们的话:我知道了,只要做一个协调。。。在函数内部定义。