我正在尝试在Racket中创建一个结构,因为我一直在教自己,我一直在努力解决它的不同练习问题。现在我正在尝试创建一个具有以下规范的结构:
姓名:
grade
领域:
midterm
(必须是整数且大于0final
(必须是整数且大于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
的保护子句也没有用。我该怎么办才能让这个保护条款有效?
答案 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)
,例如。