4

我正在编写我的第一个打字/球拍应用程序,它是一个 cli 应用程序,它会询问你一些关于你一天的统计问题,例如你前一天晚上睡了多少小时,你吃了多少,你喝了多少杯咖啡等. 应用程序首先显示问题,然后通过函数等待用户输入read。然后将收集到的信息放入struct带有预定义字段的字段中。

struct看起来像这样:

(struct: day-stats 
    ([user-id : Integer]
     ;; ... 10 more Integer fields
     ))

我的方法是首先使用每个字段的默认值 0 初始化结构,然后使用struct-copy函数在用户输入时使用信息更新结构的“实例”。

这就引出了一个问题,如何以最优雅的方式使用默认值初始化 struct?我是否创建了一个在编译/解析期间创建代码的宏,看起来像这样:

(day-stats 0 0 0 0 0 0 0 0 0 0 0)

或者是否已经有一个宏可以通过读取结构中的某种属性来做到这一点?

编辑:

在查阅了更多文档后,我发现您可以在结构中设置一个属性来自动设置字段。但是我找不到这是否可能在typed/racket. 这是它的样子racket

(struct day-stats 
    ([user-id #:auto]
     ;; ... 10 more Integer fields
    )
    #:auto-value 0)
4

1 回答 1

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)

这很容易推广到更多领域。您可以通过控制provide模块中的内容来隐藏常规构造函数。

于 2012-06-04T14:41:39.097 回答