言語仕様 · Playground

問題

毎月第 1・第 3 月曜」(ごみ収集日の定番形)の本体式を書け(前提は wkst: Mon の @JP のみ・データ不要)。

正答

mondays = everyDay |> filter(d => weekday(d) == Mon)
(mondays |> within(month) |> nth(1)) | (mondays |> within(month) |> nth(3))

判定基準: 評価範囲 2026-09-01..2026-11-01 で 2026-09-07, 2026-09-21, 2026-10-05, 2026-10-19(別解可・束縛を使わない一本書きも可)。

解説

nth は序数を 1 つしか取らない(複数序数は言語の宿題=F11)ので、「第 1 と第 3」は | で合成するのが現行の正準形。月曜の列を束縛(mondays = …)してから 2 回使うと 重複が消えて読みやすい——束縛は式の整理に使ってよい(§3.5・§4.8。ただしラムダ変数を含む部分式の括り出しは除く——束縛右辺から呼び出し側のラムダ変数は見えない=ADR-53・点依存の値は引数付き束縛で)。第 2・第 4 型 (隔週集金など)も同型で書ける。impl 実走検証済み(2026-08-01・公開 HEAD 9e46dcf)。

検証

# eval: 2026-09-01..2026-11-01
premise JP {
  calendar-system: Gregorian
  tz: "Asia/Tokyo"
  wkst: Mon
}

@JP
mondays = everyDay |> filter(d => weekday(d) == Mon)
(mondays |> within(month) |> nth(1)) | (mondays |> within(month) |> nth(3))
2026-09-07
2026-09-21
2026-10-05
2026-10-19