Some checks are pending
docs / build-and-deploy (push) Waiting to run
Finish issue #9 by adding the two remaining acceptance items on top of the calendar/clock core, still pure-integer and deterministic: DateTime.format(dt, pattern) -> string render an instant via a token pattern (YYYY/YY/MM/DD/HH/mm/ss; other chars pass through) DateTime.parse(text, pattern) -> int read an instant back; -1 on a non-digit where one is expected Clock.now/set/advance/reset a game-controlled simulated clock (the @L_clock global) that never touches the wall clock, so gameplay reading Clock.now() is replay-safe format/parse take a string-LITERAL pattern and are expanded at compile time (field offsets are then constant), folding @fn_str_concat over literal runs and two small runtime helpers: @fn_dt_pad0 (zero-padded field) and @fn_dt_rd (fixed-width digit reader that stops at the terminator and flags malformed input). Clock is a universal i32 global declared in emit_head, so it works in entry and game programs alike. Adds examples/offline_rewards.ludic — the issue's worked "you were away N hours" example, driven from its own entry and asserted in the regression suite — plus selfhost/tests/datetime2.ludic (format/parse round-trip, parse failure, clock), docs (Clock section + 4 pages, DateTime.format/parse pages), inventory and LSP hover. Reseeded; C-free fixpoint holds; all suites green (27 self-host / 46 regression / 29 tools); check.py (366 symbols), check-impl.py (218 ns-methods) and validate.py OK. With this, #9's scope is fully delivered: DateTime/Date/Duration + core ops, format/parse, a deterministic simulated clock, docs + offline-rewards example, and tests. (v1 stays UTC-only, no leap seconds, i32 epoch valid through 2038.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
917 B
Text
23 lines
917 B
Text
program T {
|
|
entry {
|
|
let t = DateTime.from(2026, 8, 30, 7, 5, 9)
|
|
|
|
# format — tokens expand zero-padded, other chars pass through
|
|
print(DateTime.format(t, "YYYY-MM-DD")) # 2026-08-30
|
|
print(DateTime.format(t, "HH:mm:ss")) # 07:05:09
|
|
print(DateTime.format(t, "DD/MM/YY")) # 30/08/26
|
|
|
|
# parse — round-trips to the same instant; missing fields default to midnight
|
|
print(DateTime.parse("2026-08-30", "YYYY-MM-DD") - Date.to_epoch(Date.new(2026, 8, 30))) # 0
|
|
print(DateTime.parse("zz", "YYYY")) # -1 (non-digit -> parse fails)
|
|
|
|
# Clock — the game-controlled simulated clock
|
|
Clock.set(3600)
|
|
print(Clock.now()) # 3600
|
|
Clock.advance(Duration.minutes(30))
|
|
print(Clock.now()) # 5400
|
|
print(DateTime.minute(Clock.now())) # 30
|
|
Clock.reset()
|
|
print(Clock.now()) # 0
|
|
}
|
|
}
|