2016-12-10 6 views
1

私は自分自身に教えているように構造体を作成しようとしていますが、私はさまざまな練習問題それのための。今、私は、次の仕様を持つ構造体を作成しようとしている:複数の値を返す構造体にガード句を書くにはどうすればいいですか?

名:grade
フィールド:

midterm(整数と大きい0
finalよりでなければならない(でなければなりません整数、0より大きい)
course(記号または偽でなければなりません)

私がこれまで書いてきたことは、この

(struct grade (midterm final course) 
    #:guard (λ (midterm final course name) 
      (unless (and (integer? final) (> final 0)) 
       (error "not a valid final grade")) 
      (unless (and (integer? midterm) (> midterm 0)) 
       (error "not a valid midterm grade")) 
      (unless (or (symbol? course) (false? course)) 
       (error "not a valid course grade")) 
      '(midterm final course))) 

ですが、それはunimplementableです。私は、ガード節がリスト'(midterm final course)を返すので、私は信じていますが、(midterm final course)を返し、ちょうどmidterm final courseを返すガード句を含む私が試した他の実装もうまくいきませんでした。このガード節を動作させるにはどうすればよいですか?

答えて

1

ガード句の結果は、構造体の各フィールドに1つずつ、n valuesである必要があります。これはリストとは異なることに注意してください。残りのロジックが正しいと仮定すると、'(midterm final course)(values midterm final course)に置き換えるだけで済みます。完全な結果は以下の通りです。

(struct grade (midterm final course) 
    #:guard (λ (midterm final course name) 
      (unless (and (integer? final) (> final 0)) 
       (error "not a valid final grade")) 
      (unless (and (integer? midterm) (> midterm 0)) 
       (error "not a valid midterm grade")) 
      (unless (or (symbol? course) (false? course)) 
       (error "not a valid course grade")) 
      (values midterm final course))) 

これで、たとえば(grade 100 100 'racket101)を実行できます。

+0

ありがとうございました!私は価値観が存在することを知らなかった。これは完璧です。 –

関連する問題