2017-03-18 1 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:

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

それとも、代わりに関数にマッピングされたシンボルをハッシュテーブルを作ることができる:Don't use eval.

はアクセサに属性シンボルに変換ヘルパー関数を書くことを検討してください。

推奨#2:にする必要がある場合は、evalを使用する必要があります。正しい名前空間を指定していることを確認する必要があります。 reflection and dynamic evaluationの文書、特に名前空間に関する部分を読んでください。

関連する問題