如何在Racket记录中引用元组?Beginner自定义语言场景求助
解决Racket Beginner自定义语言中记录的坐标元组类型问题
方法1:移除类型约束,直接接受任意值
既然你只是需要存储'(x y)形式的坐标列表,而Beginner自定义语言里没有tuple这个内置类型,最简单的方式就是去掉这个不存在的类型标识,让flower-coordinates接受任意值:
(define-record flower make-flower flower? (flower-name string) (flower-waterlevel natural) (flower-coordinates)) ; 移除类型约束 (define new_flower (make-flower "Blubb" 50 '(23 12)))
这样就能正常创建记录,后续使用flower-coordinates时直接读取列表里的x、y值即可。
方法2:自定义坐标检查谓词,实现类型约束
如果想要确保flower-coordinates必须是两个数字组成的列表,可以自己写一个检查函数,把它作为类型约束用在记录定义里:
; 定义检查函数:判断是否是包含两个数字的列表 (define (coordinate-tuple? val) (and (list? val) (= (length val) 2) (number? (first val)) (number? (second val)))) (define-record flower make-flower flower? (flower-name string) (flower-waterlevel natural) (flower-coordinates coordinate-tuple?)) ; 使用自定义谓词 (define new_flower (make-flower "Blubb" 50 '(23 12))) ; 符合约束,正常运行 ; (define bad_flower (make-flower "Oops" 50 '(23))) ; 不符合约束,会触发错误
这种方式能自动拦截不符合要求的输入,保证数据合法性。
方法3:用结构体封装坐标(更清晰的结构化方式)
你也可以把坐标单独定义成一个小型结构体,让数据结构更直观:
(define-record coordinate make-coordinate coordinate? (x number) (y number)) (define-record flower make-flower flower? (flower-name string) (flower-waterlevel natural) (flower-coordinates coordinate?)) ; 创建记录时先构造坐标结构体 (define new_flower (make-flower "Blubb" 50 (make-coordinate 23 12)))
后续访问坐标时,可以用(x (flower-coordinates new_flower))和(y (flower-coordinates new_flower)),比直接取列表元素可读性更强。
内容的提问来源于stack exchange,提问作者Celeste
相关产品推荐
相关产品推荐

