如何在typed / racket中使用默认值初始化结构?

时间:2012-06-03 14:47:26

标签: struct macros scheme racket typed-racket

我正在编写我的第一个打字/球拍应用程序,它是一个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)

1 个答案:

答案 0 :(得分:3)

目前Typed Racket不支持使用#:auto的结构。一般来说,#: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来隐藏常规构造函数。