rze*_*erg 4 macros scheme struct racket typed-racket
我正在编写我的第一个打字/球拍应用程序,它是一个 cli 应用程序,它会询问你一些关于你一天的统计问题,比如你前一天晚上睡了多少小时,你吃了多少,你喝了多少杯咖啡等. 应用程序首先显示问题,然后通过函数等待用户输入read。然后将收集到的信息放入struct带有预定义字段的字段中。
该struct如下所示:
(struct: day-stats
([user-id : Integer]
;; ... 10 more Integer fields
))
Run Code Online (Sandbox Code Playgroud)
我的方法是首先使用每个字段的默认值 0 初始化结构,然后使用该struct-copy函数在用户输入时使用信息更新结构的“实例” 。
这引出了我的问题,如何以最优雅的方式使用默认值初始化结构?我是否创建了一个在编译/解析过程中创建代码的宏,它看起来像这样:
(day-stats 0 0 0 0 0 0 0 0 0 0 0)
Run Code Online (Sandbox Code Playgroud)
或者已经有一个宏可以通过读取结构中的某种属性来做到这一点?
编辑:
在查阅了更多文档后,我发现您可以在结构中设置一个属性来自动设置字段。但是,我无法在typed/racket. 这是它的样子racket:
(struct day-stats
([user-id #:auto]
;; ... 10 more Integer fields
)
#:auto-value 0)
Run Code Online (Sandbox Code Playgroud)
#:autoTyped Racket 目前不支持使用的结构。一般来说,这#:auto是一个非常不灵活的功能,我不会在 Racket 或 Typed Racket 中正常使用。
相反,只需创建一个简单的构造函数,如下所示:
#lang typed/racket
(struct: day-stats ([x : Integer] [y : Integer]))
(define (mk-day-stats) (day-stats 0 0))
(mk-day-stats)
Run Code Online (Sandbox Code Playgroud)
这很容易推广到更多领域。您可以通过控制provide模块中的内容来隐藏常规构造函数。