如何在类型化/球拍中使用默认值初始化结构?

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)

Sam*_*adt 5

#: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模块中的内容来隐藏常规构造函数。