4

私は最初の入力/ラケット アプリケーションを作成しています。これは、前夜の睡眠時間、食べた量、コーヒーを何杯飲んだかなど、1 日に関する統計的な質問をする cli アプリケーションです。 . アプリケーションは、最初に質問を表示し、関数を介してユーザー入力を待機することでこれを行いますread。収集された情報は、事前定義されたフィールドに入れられstructます。

は次のstructようになります。

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

これに対する私のアプローチは、最初に各フィールドのデフォルト値 0 で構造体を初期化し、次にstruct-copy関数を使用してユーザーが入力した情報で構造体の「インスタンス」を更新することです。

それは私を質問に導きます.最もエレガントな方法でデフォルト値で構造体を初期化するにはどうすればよいですか? コンパイル/解析中に次のようなコードを作成するマクロを作成しますか?

(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

を使用する構造#:auto体は、現在 Typed 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 に答える