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