如何在返回多个值的结构中编写保护子句

时间:2016-12-10 15:17:08

标签: racket

我正在尝试在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)))

但它无法实现。我相信因为guard子句返回列表'(midterm final course),但是我尝试过的其他实现,包括返回(midterm final course)midterm final course的保护子句也没有用。我该怎么办才能让这个保护条款有效?

1 个答案:

答案 0 :(得分:1)

guard子句的结果必须是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),例如。