2017-03-18 45 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 "") 

它給了我關於結構功能奇怪的錯誤沒有被定義,但我已經要求在測試文件中定義和使用該結構的文件... 我確實使用Racket 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的文檔,特別是關於命名空間的部分。