2016-12-10 7 views
1

Я пытаюсь создать структуру в Racket, поскольку я преподавал ее себе, и я пытался справиться с различными практическими проблемами для этого. Сейчас я пытаюсь создать структуру, которая имеет следующие характеристики:Как написать предложение охраны в структуре, которая возвращает более одного значения

имя: 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))) 

Но это нереализуемое. Я верю, потому что предложение охраны возвращает список '(midterm final course), но другие реализации, которые я пробовал, которые включали предложение охраны, возвращающее (midterm final course) и только midterm final course, также не помогли. Что я могу сделать, чтобы эта оговорка охранника работала?

ответ

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

Спасибо! Я понятия не имел, что существуют «ценности». Это потрясающе. –