2013-11-24 2 views
1

나는 라켓의 영역을 따라 가고 있습니다. 좌표가 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... 

내가 라켓을 contractstruct 문서를 확인하지만, 원인을 찾을 수 없습니다 : 아래 빅뱅 기능 전에 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-fileufo을 else 브랜치의 계단식으로 넣는 것이 필수적인지 궁금합니다.

+0

확실히 작동하지만, 라켓 및 함수 언어로 작업하는 것이 바람직한 방법은 아닙니다. 기존의 pos를 "변경"(변경)하는 대신 구조체 정의에서'# : mutable' 키워드를 제거해야하고'increment' 함수에서 새로운 pos를 생성해야합니다 (실제로는 하나를 변경하는 것보다 간단합니다) , 여기). – Metaxal

+0

오, 그렇습니다. 그것은 "파괴적"이라는 뜻입니다. 나는 기능적인 방식을 좋아하고 체계적인 것을 배우려고 노력하고 있지만, 나는 돌연변이를 알아내는 것이 힘들다. 힌트를 가져 주셔서 감사합니다. – barerd

+0

@ Metaxal : 구조 복사 및 일부 begin 문을 사용하여 새 pos를 만들려고했지만 성공하지 못했습니다. 그것에 관한 문서를 안내해 주시겠습니까? – barerd

답변

0

일반적으로 함수가 값을 반환한다고 가정하면 given: #<void>과 같은 오류가 발생하지만 그렇지 않습니다.나쁜 예 :

(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 절의 모든 변형이 big-bang 인 경우 HandlerResult이 아닌 #<void>이 아닌 것으로 간주됩니다.

출처 : http://docs.racket-lang.org/teachpack/2htdpuniverse.html#(form._world._((lib._2htdp/universe..rkt)._to-draw))set-coord-alt! 무엇

하고 무엇을 반환하지?

+0

지연에 대해 대단히 죄송합니다. 문서를 살펴 보았습니다. 편집을 참조하십시오. 간단히 말해, 증가 함수의 끝에 pos를 추가했을 때 효과가있었습니다. – barerd

관련 문제