feat(core): SwiftForth input number conversion, DPL and NH
Punctuation (`,` `.` `+` `/` `:` and an embedded `-`) after the leftmost digit now forces double-cell conversion, so `12.34`, `1,234`, `12:30:45` and `2026-08-06` convert as doubles. Only a trailing `.` worked before, and `1.5` was an "unknown word" error. The punctuation is a double-cell marker, not a fractional point, so the scale has to travel separately: DPL carries the digit count right of the rightmost punctuation character (negative when there was none), which is what lets `<# #>` place the point back on output. NH carries the high cell a single-cell conversion drops, so a token that overflows a cell is still recoverable as a double. parse_number and parse_double_number duplicated the prefix and sign handling and could not share a DPL counter, so they collapse into one parse_numeric_literal that reports which kind it converted. Verified token-for-token against sf64. One deliberate divergence: WAFER keeps accepting a sign before a base prefix (`-$FF`), which sf64 rejects.
This commit is contained in:
@@ -350,6 +350,16 @@ pub const WORD_DOCS: &[(&str, &str, &str)] = &[
|
||||
"Convert digits, accumulating into ud.",
|
||||
),
|
||||
("BASE", "( -- addr )", "Variable holding the number base."),
|
||||
(
|
||||
"DPL",
|
||||
"( -- addr )",
|
||||
"Variable: digits right of the last punctuation; negative if none.",
|
||||
),
|
||||
(
|
||||
"NH",
|
||||
"( -- addr )",
|
||||
"Variable: high cell dropped by the last single-cell conversion.",
|
||||
),
|
||||
("HEX", "( -- )", "Set BASE to sixteen."),
|
||||
("DECIMAL", "( -- )", "Set BASE to ten."),
|
||||
// -- Core: strings --
|
||||
|
||||
Reference in New Issue
Block a user