Racket AND 逻辑语句或嵌套 if 与结构

Racket AND logical statement or nested if's with struct

我正在尝试使用 AND 或嵌套 if 逻辑语句制作一个简单的 Racket 代码块。这应该只是指定变量小时数是否大于 0 且小于 24 小时,分钟数是否大于 0 且小于 60 分钟,在一个名为 24hourClock 的结构中,如果不是,它应该分别为小时数或分钟数键入一个 else 错误语句。如果可以的话,请告诉我是否有小的语法错误,我现在才刚刚开始学习 struct 和 Racket。谢谢

;Attempt 1
(struct 24HourClock (hours minutes)
  #:transparent
  #:guard     (if (number? hours)
                  (error name "24HourClock: Hours must between 0 and 23:24.")
                  (if (number? minutes)
                     (error name "24HourClock: Minutes must between 0 and 59:60.")                
                (values x y))))            

;Attempt 2                 
(struct 24HourClock5 (hours minutes)
 #:guard (lambda (hours minutes error_name)
           (if (not (and (number? hours) (number? minutes)))
               (error error_name "Both fields hours and minutes must be between 0:24 and 0:60")
               (values hours minutes)))) 

守卫参数必须是一个过程,就像你第二次尝试的那样。
在结构定义之外定义它可能是个好主意,因为它并不十分微小。
可能是这样的:

(define (valid-hours h)
  (and (>= h 0) (< h 24)))

(define (valid-minutes m)
  (and (>= m 0) (< m 60)))

(define (valid-time h m name)
  (cond
    [(not (valid-hours h)) (error name "Bad hours")]
    [(not (valid-minutes m)) (error name "Bad minutes")]
    [else (values h m)]))

(struct 24HourClock (hours minutes)
  #:transparent
  #:guard valid-time)