2017-03-18 3 views
1

의미 이상한 :라켓 (필요 ...) 나는 라켓 코드가

또한
#lang racket 
(provide (all-defined-out)) 

(struct weather (name perspective temperature humidity wind class) 
#:transparent) 

;;Exercise 8 
;;Todo implement 
#;(define (read-examples file-name) 
    (file->lines file-name)) 

;;todo uncomment 
#;(define examples (read-examples "examples.txt")) 

;;Exercise 9 
(define (add-example examples example) 
    (cons example examples)) 

;;Exercise 10 
(define (attribute which examples) 
    (define command (eval (string->symbol(string-append "weather-" 
(symbol->string which))))) 
    (if (null? examples) null 
     (cons (command (car examples)) (attribute which (cdr examples))))) 

테스트 파일 : 그것은 나에게 정의되지 않은 구조체 기능에 대한 이상한 오류를 제공

#lang racket 
(require rackunit "xalt2.rkt") 

(define examples (list (weather "Day1" 'cloudy -5 60 'yes '-) 
        (weather "Day2" 'cloudy 0 30 'no '+) 
        (weather "Day3" 'cloudy 10 45 'no '+) 
        (weather "Day4" 'cloudy 20 60 'yes '-) 
        (weather "Day5" 'cloudy 30 80 'no '+))) 

;;tests for Exercise 9 
(define argument-for-add-example (weather "Day77" 'cloudy 39 87 'no '+)) 
(define expected-result (cons argument-for-add-example examples)) 
(check-equal? (add-example examples argument-for-add-example) expected-result "addind to list is not working?") 

;;tests for Exercise 10 
(check-equal? (attribute 'wind examples) null "") 

을,하지만 난 구조체가 정의 된 파일을 테스트 파일에 사용하도록 요구했습니다. 라켓 6.8을 사용합니다.

답변

4

잘못된 네임 스페이스에 eval을 사용하고 있기 때문에 오류가 발생합니다.

추천 # 1 :

Don't use eval.이 접근에 속성 기호를 변환하는 도우미 함수를 작성을 고려해보십시오 대신 기능에 대한 문자 매핑 해시 테이블을 만들 수

;; get-attribute-function : Symbol -> (Weather -> Any) 
(define (get-attribute-function attr) 
    (case attr 
    [(name) weather-name] 
    ....)) 

또는.

권장 사항 # 2 : 이어야합니다. eval을 사용해야하는 경우 올바른 네임 스페이스를 지정해야합니다. reflection and dynamic evaluation에있는 문서, 특히 네임 스페이스에 관한 부분을 읽으십시오.