나는 라켓의 영역을 따라 가고 있습니다. 좌표가 COORD 아니라고 affirmates 디버그를위한 (coord? pos)
조건 추가 라켓의 계약 위반 및 구조 오류를 파악할 수 없습니다.
#lang racket
(require 2htdp/universe 2htdp/image)
(struct coord (alt lat) #:transparent #:mutable)
(define WIDTH 400)
(define HEIGHT 400)
(define UFO *some_picture*)
(define (move-ufo pos)
(place-image/align UFO
(coord-alt pos)
(coord-lat pos)
"left" "top"
(empty-scene WIDTH HEIGHT)))
(define (increment pos)
(set-coord-alt! pos (+ 2 (coord-alt pos)))
(set-coord-lat! pos (+ 1 (coord-lat pos))))
(define (at-the-border pos)
(>= (coord-lat pos) (- HEIGHT 20)))
(big-bang (coord 0 0)
(on-tick increment)
(to-draw move-ufo)
(stop-when at-the-border))
coord-lat: contract violation
expected: coord?
given: #<void>
플라이 ufo.rkt : 아래의 코드는 다음과 같은 오류가 발생합니다.
(define s (coord 0 0))
(big-bang s...
내가 라켓을 contract 및 struct 문서를 확인하지만, 원인을 찾을 수 없습니다 : 아래 빅뱅 기능 전에 COORD으로 현재 상태를 정의하는 것은 오류가 해결되지 않았다. 많은 예제들이 define-struct
을 사용했기 때문에 나는 또한 그것을 시도했고 make-coord
, 그러나 이것은 또한 도움이되지 못했다. 라켓 문서는 또한 struct is preferred을 제안합니다.
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
는 여기에서 오류의 원인이 될 수 있습니다
COORD
(provide coord)
(define-struct/contract coord ([alt number?]
[lat number?])
#:transparent
#:mutable)
에 다음과 같은 오류가 계약을 원인 추가?
편집
@Greg Hendershott : 설정 COORD-ALT! :
set-id-field-id!는 # : mutable 옵션을 포함하는 각 필드에 대해 또는 # : mutable 옵션이 struct-option으로 지정된 경우 in the struct document of racket입니다. 구조체 유형 및 새 필드 값의 인스턴스를 취하는 mutator 프로 시저입니다. 구조체가 새로운 값으로 파괴적으로 업데이트되고 #<void>
이 반환됩니다. 내가 마지막 문장을 읽을 때 함수가 어떻게 든 전에 놓친 #<void>
을 반환하는 이유
그래서, 나는 얻었다. 그래서, 대신 #<void>
의 COORD을 반환하기 위해, 필자는 증가 함수의 끝에서 pos
추가 :
(define (increment pos)
(set-coord-alt! pos (+ 2 (coord-alt pos)))
(set-coord-lat! pos (+ 1 (coord-lat pos)))
pos)
그것은했다.
2 EDIT
난 그냥 향후 참조를 위해 이러는거야. 그 후
;; 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))
하고, UFO가처럼 간단되었다 중지 : 위쪽으로
(define (stop ufo)
(cs (cs-lat ufo) (cs-alt ufo) 0 0))
및 가속화되었다 : Metaxal 한 새로운 구조체를 작성해야한다고 언급 한 후 다음과 같이 나는 구조체를 업데이트
(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]))
이제는 play-sound-file
과 ufo
을 else 브랜치의 계단식으로 넣는 것이 필수적인지 궁금합니다.
확실히 작동하지만, 라켓 및 함수 언어로 작업하는 것이 바람직한 방법은 아닙니다. 기존의 pos를 "변경"(변경)하는 대신 구조체 정의에서'# : mutable' 키워드를 제거해야하고'increment' 함수에서 새로운 pos를 생성해야합니다 (실제로는 하나를 변경하는 것보다 간단합니다) , 여기). – Metaxal
오, 그렇습니다. 그것은 "파괴적"이라는 뜻입니다. 나는 기능적인 방식을 좋아하고 체계적인 것을 배우려고 노력하고 있지만, 나는 돌연변이를 알아내는 것이 힘들다. 힌트를 가져 주셔서 감사합니다. – barerd
@ Metaxal : 구조 복사 및 일부 begin 문을 사용하여 새 pos를 만들려고했지만 성공하지 못했습니다. 그것에 관한 문서를 안내해 주시겠습니까? – barerd