Как вы инициализируете структуру значениями по умолчанию в typed/racket?

Я пишу свое первое приложение для набора текста/рэкета, которое представляет собой приложение 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)

person rzetterberg    schedule 03.06.2012    source источник


Ответы (1)


Структуры, использующие #: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 из своего модуля.

person Sam Tobin-Hochstadt    schedule 04.06.2012
comment
Спасибо за ответ! Кстати, вы рекомендуете продолжать использовать typed/racket для новичков или мне следует сначала ознакомиться с racket? - person rzetterberg; 04.06.2012
comment
Что ж, как автор, я несколько предвзято отношусь к Typed Racket. :) Но вы должны быть в состоянии хорошо учиться в Typed Racket, хотя большая часть вводного материала написана для простого Racket, и вам придется переводить его самостоятельно. - person Sam Tobin-Hochstadt; 04.06.2012
comment
Идеально! Еще раз спасибо, и продолжайте в том же духе с Typed Racket! :) - person rzetterberg; 04.06.2012