diff --git a/conformance/SURFACE.md b/conformance/SURFACE.md new file mode 100644 index 0000000..14301aa --- /dev/null +++ b/conformance/SURFACE.md @@ -0,0 +1,91 @@ +# SURFACE — what `js/mpl.js` actually implements + +Audited from the source of `js/mpl.js` (Stage 2, C3) and pinned by the +corpus. This file describes the implemented surface — exactly, no more. +Nothing here is ratified; where behavior looks accidental it is flagged in +`conformance/JUDGMENT_CALLS.md`, but it is recorded as observed. + +## Lexer + +- Whitespace: space, tab, CR, LF. +- Comments: line `-- …`; block `{- … -}`, nesting tracked (unterminated → + `err_comment`). +- Strings: `"…"`, escape `\n` → newline, `\t` → tab, any other `\x` → `x` + (the backslash is silently dropped — `\q` becomes `q`); unterminated → + `err_string`. +- ASCII escapes: `\word` for word ∈ {lambda, forall, in, coloneq, + leftarrow, implies, and, or, neq, leq, geq, times, div, trace, bot, + parallel, circ, ast}; unknown word → `err_escape`. +- Numbers: `[0-9]+(.[0-9]+)?` via `parseFloat` (all numbers are JS + doubles; no scientific notation, no leading `.`). +- Identifiers: `[a-zA-Z][a-zA-Z0-9_]*`; `true`/`false` are boolean + literals. A leading `_` is not an identifier start (`err_char`). +- Type symbols `ℕ ℤ ℚ ℝ ℂ 𝔹` lex as identifiers (code-point-safe; 𝔹 is + supplementary-plane). +- Single-char tokens: `✎ λ ∀ ∈ ≜ ← ⟹ ∧ ∨ ≠ ≤ ≥ × ÷ ∗ ∘ ‖ ⊥ + - / = < > | + ; : , ( ) [ ] { }`. +- Anything else → `err_char`. + +## Parser (loosest to tightest) + +`;` sequence → `‖` (desugars to sequence!) → `≜` (right-assoc, id target +only) → `←` (right-assoc, id target only) → `|` (left-assoc) → `⟹` +(right-assoc) → `∨` → `∧` → comparison (`= ≠ < > ≤ ≥`, non-associative — +`1 < 2 < 3` is a parse error) → `+ -` → `× ∗ ÷ /` → unary (`✎`, `-`) → +call `f(a, …)` (postfix, nullary `f()` parses) → atom. + +Atoms: number/string/bool literals, `⊥`, identifiers, +`λ params [∈ constraint] : body` (≥ 1 parameter; the constraint is parsed +and **discarded unevaluated**), `∀ id ∈ expr : body`, list `[…]`, parens +`( expr )` (a single expression — `;` inside parens is a parse error), +braces `{ seq }` (`{}` evaluates to `⊥`). + +Parse-class error keys: `err_char`, `err_escape`, `err_string`, +`err_comment`, `err_expect`, `err_unexpected`, `err_def_target`, +`err_assign_target`. + +Lexed but unusable: `∘` (compose) has a token and an escape but **no +parser rule** — any use is `err_expect`. + +## Evaluator + +- Values: number (double), string, boolean, list, closure, `⊥`. +- `✎ e` prints `show(value)` and returns the value. +- `show`: `⊥` → `⊥`; strings bare at top level but **quoted inside + lists**; lists `[a, b]`; closures → `λ`; booleans `true`/`false`; + numbers via JS `String()` (integral doubles print without `.0`). +- `+` is numeric addition unless either side is a string — then it is + concatenation of `show`-rendered operands. `- × ∗ ÷ /` are numeric only + (`err_num`), `÷ 0` → `err_div0`. +- Guards: `c ⟹ e` fires iff `c` is `true` **or a non-zero number**; + strings/lists/`⊥` never fire. A non-firing guard yields NOMATCH, which + `|` catches; NOMATCH surfacing anywhere else becomes `⊥`. +- `∧ ∨`: short-circuit; operands are tested with `=== true`, so non-boolean + operands behave as false (`1 ∧ true` → `false` — contrast with `⟹`). +- Comparison: `=`/`≠` via JSON serialization (structural for lists, + cross-type → `false`, `⊥ = ⊥` → `true`, comparing a self-referential + closure crashes keyless); `< > ≤ ≥` are raw JS comparisons (mixed-type + coercion applies). +- `≜` binds in the **current** scope; `←` mutates the nearest enclosing + binding, creating one in the current scope if none exists. Both return + the value; both may rebind. +- Braces `{…}` do **not** create a scope (bindings leak out). λ bodies and + each `∀` iteration do (the `∀` variable shadows and is restored). +- Closures capture the defining **environment** (later mutations are + visible), enabling recursion via `≜`. +- `∀ x ∈ list : body` requires a list (`err_iter`), evaluates the body per + element, and yields the last body value (`⊥` for an empty list). +- Errors carry a key + 1-based line:col. Runtime keys: `err_undef`, + `err_num`, `err_div0`, `err_notfn`, `err_arity`, `err_iter`, + `err_steps` (evaluation-step budget: 500 000). +- Deep recursion overflows the host stack **before** the step budget — + a keyless RangeError, unpinnable by the corpus (see JUDGMENT_CALLS). + +## Explicitly out of corpus scope + +- `‖` — parses, and the evaluator runs it as plain sequencing, but its + semantics are an M1 design question (locked decision 6): no corpus + entry pins it. +- Everything the grammar has that `js/mpl.js` does not implement (modules, + resources, channels, exceptions, metaprogramming, records, sets, choice + types, …) — Stage 4/5 artifacts, not Stage 2 ones. diff --git a/conformance/corpus/003_arith_precedence/expected.out b/conformance/corpus/003_arith_precedence/expected.out new file mode 100644 index 0000000..1fd15ed --- /dev/null +++ b/conformance/corpus/003_arith_precedence/expected.out @@ -0,0 +1,5 @@ +14 +20 +5 +2 +4 diff --git a/conformance/corpus/003_arith_precedence/meta.json b/conformance/corpus/003_arith_precedence/meta.json new file mode 100644 index 0000000..9842a4b --- /dev/null +++ b/conformance/corpus/003_arith_precedence/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "× ÷ bind tighter than + -; + - and × ÷ left-associative"} diff --git a/conformance/corpus/003_arith_precedence/program.mpl b/conformance/corpus/003_arith_precedence/program.mpl new file mode 100644 index 0000000..ad2e7c4 --- /dev/null +++ b/conformance/corpus/003_arith_precedence/program.mpl @@ -0,0 +1,5 @@ +✎(2 + 3 × 4); +✎((2 + 3) × 4); +✎(10 - 2 - 3); +✎(20 ÷ 2 ÷ 5); +✎(2 + 12 ÷ 4 - 1); diff --git a/conformance/corpus/004_unary_minus/expected.out b/conformance/corpus/004_unary_minus/expected.out new file mode 100644 index 0000000..78303ca --- /dev/null +++ b/conformance/corpus/004_unary_minus/expected.out @@ -0,0 +1,5 @@ +-5 +5 +5 +-6 +-3 diff --git a/conformance/corpus/004_unary_minus/meta.json b/conformance/corpus/004_unary_minus/meta.json new file mode 100644 index 0000000..735624e --- /dev/null +++ b/conformance/corpus/004_unary_minus/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "unary minus, including doubled and against binary minus"} diff --git a/conformance/corpus/004_unary_minus/program.mpl b/conformance/corpus/004_unary_minus/program.mpl new file mode 100644 index 0000000..669aedf --- /dev/null +++ b/conformance/corpus/004_unary_minus/program.mpl @@ -0,0 +1,5 @@ +✎(-5); +✎(- -5); +✎(3 - -2); +✎(-2 × 3); +✎(-(1 + 2)); diff --git a/conformance/corpus/005_slash_div_alias/expected.out b/conformance/corpus/005_slash_div_alias/expected.out new file mode 100644 index 0000000..5979a16 --- /dev/null +++ b/conformance/corpus/005_slash_div_alias/expected.out @@ -0,0 +1,3 @@ +2.5 +2.5 +3 diff --git a/conformance/corpus/005_slash_div_alias/meta.json b/conformance/corpus/005_slash_div_alias/meta.json new file mode 100644 index 0000000..a1a594c --- /dev/null +++ b/conformance/corpus/005_slash_div_alias/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "/ is an ASCII alias of ÷"} diff --git a/conformance/corpus/005_slash_div_alias/program.mpl b/conformance/corpus/005_slash_div_alias/program.mpl new file mode 100644 index 0000000..0cda671 --- /dev/null +++ b/conformance/corpus/005_slash_div_alias/program.mpl @@ -0,0 +1,3 @@ +✎(10 / 4); +✎(10 ÷ 4); +✎(9 / 3); diff --git a/conformance/corpus/006_number_display/expected.out b/conformance/corpus/006_number_display/expected.out new file mode 100644 index 0000000..8176562 --- /dev/null +++ b/conformance/corpus/006_number_display/expected.out @@ -0,0 +1,6 @@ +42 +1.5 +0.5 +2 +7 +0.5 diff --git a/conformance/corpus/006_number_display/meta.json b/conformance/corpus/006_number_display/meta.json new file mode 100644 index 0000000..576aaa9 --- /dev/null +++ b/conformance/corpus/006_number_display/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "integral doubles display without decimal point; literals normalize"} diff --git a/conformance/corpus/006_number_display/program.mpl b/conformance/corpus/006_number_display/program.mpl new file mode 100644 index 0000000..419c0d5 --- /dev/null +++ b/conformance/corpus/006_number_display/program.mpl @@ -0,0 +1,6 @@ +✎ 42; +✎ 1.5; +✎(1 ÷ 2); +✎(4 ÷ 2); +✎ 007; +✎ 0.50; diff --git a/conformance/corpus/007_float_arithmetic/expected.out b/conformance/corpus/007_float_arithmetic/expected.out new file mode 100644 index 0000000..b2d9daf --- /dev/null +++ b/conformance/corpus/007_float_arithmetic/expected.out @@ -0,0 +1,3 @@ +3.75 +0.30000000000000004 +6 diff --git a/conformance/corpus/007_float_arithmetic/meta.json b/conformance/corpus/007_float_arithmetic/meta.json new file mode 100644 index 0000000..3af907b --- /dev/null +++ b/conformance/corpus/007_float_arithmetic/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "IEEE double arithmetic, including the 0.1+0.2 representation artifact"} diff --git a/conformance/corpus/007_float_arithmetic/program.mpl b/conformance/corpus/007_float_arithmetic/program.mpl new file mode 100644 index 0000000..90603f4 --- /dev/null +++ b/conformance/corpus/007_float_arithmetic/program.mpl @@ -0,0 +1,3 @@ +✎(1.5 + 2.25); +✎(0.1 + 0.2); +✎(3.0 × 2); diff --git a/conformance/corpus/008_string_escapes/expected.out b/conformance/corpus/008_string_escapes/expected.out new file mode 100644 index 0000000..0dede9b --- /dev/null +++ b/conformance/corpus/008_string_escapes/expected.out @@ -0,0 +1,5 @@ +a +b +a b +q"q +b\b diff --git a/conformance/corpus/008_string_escapes/meta.json b/conformance/corpus/008_string_escapes/meta.json new file mode 100644 index 0000000..3473af1 --- /dev/null +++ b/conformance/corpus/008_string_escapes/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "string escapes \\n \\t \\\" \\\\ (unknown escapes like \\q diverge from the grammar — see DIVERGENCES.md, not corpus-pinnable)"} diff --git a/conformance/corpus/008_string_escapes/program.mpl b/conformance/corpus/008_string_escapes/program.mpl new file mode 100644 index 0000000..e75664f --- /dev/null +++ b/conformance/corpus/008_string_escapes/program.mpl @@ -0,0 +1,4 @@ +✎ "a\nb"; +✎ "a\tb"; +✎ "q\"q"; +✎ "b\\b"; diff --git a/conformance/corpus/009_string_concat/expected.out b/conformance/corpus/009_string_concat/expected.out new file mode 100644 index 0000000..d0d3f1a --- /dev/null +++ b/conformance/corpus/009_string_concat/expected.out @@ -0,0 +1,6 @@ +n=5 +5! +l=[1, 2] +b=true +v=⊥ +ab diff --git a/conformance/corpus/009_string_concat/meta.json b/conformance/corpus/009_string_concat/meta.json new file mode 100644 index 0000000..4fb1f43 --- /dev/null +++ b/conformance/corpus/009_string_concat/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "+ concatenates when either operand is a string, rendering the other via show"} diff --git a/conformance/corpus/009_string_concat/program.mpl b/conformance/corpus/009_string_concat/program.mpl new file mode 100644 index 0000000..7764025 --- /dev/null +++ b/conformance/corpus/009_string_concat/program.mpl @@ -0,0 +1,6 @@ +✎("n=" + 5); +✎(5 + "!"); +✎("l=" + [1, 2]); +✎("b=" + true); +✎("v=" + ⊥); +✎("a" + "b"); diff --git a/conformance/corpus/010_multilingual_strings/expected.out b/conformance/corpus/010_multilingual_strings/expected.out new file mode 100644 index 0000000..a5fae67 --- /dev/null +++ b/conformance/corpus/010_multilingual_strings/expected.out @@ -0,0 +1,3 @@ +مرحبا +你好 +Salaam diff --git a/conformance/corpus/010_multilingual_strings/meta.json b/conformance/corpus/010_multilingual_strings/meta.json new file mode 100644 index 0000000..92fdced --- /dev/null +++ b/conformance/corpus/010_multilingual_strings/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "non-ASCII string content passes through byte-intact"} diff --git a/conformance/corpus/010_multilingual_strings/program.mpl b/conformance/corpus/010_multilingual_strings/program.mpl new file mode 100644 index 0000000..e067939 --- /dev/null +++ b/conformance/corpus/010_multilingual_strings/program.mpl @@ -0,0 +1,3 @@ +✎ "مرحبا"; +✎ "你好"; +✎ "Salaam"; diff --git a/conformance/corpus/011_list_display/expected.out b/conformance/corpus/011_list_display/expected.out new file mode 100644 index 0000000..28da082 --- /dev/null +++ b/conformance/corpus/011_list_display/expected.out @@ -0,0 +1,3 @@ +[1, "two", true, [3, 4], ⊥] +[] +[λ] diff --git a/conformance/corpus/011_list_display/meta.json b/conformance/corpus/011_list_display/meta.json new file mode 100644 index 0000000..dcea76b --- /dev/null +++ b/conformance/corpus/011_list_display/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "lists display with strings quoted inside; closures display as λ"} diff --git a/conformance/corpus/011_list_display/program.mpl b/conformance/corpus/011_list_display/program.mpl new file mode 100644 index 0000000..ff2bead --- /dev/null +++ b/conformance/corpus/011_list_display/program.mpl @@ -0,0 +1,4 @@ +id ≜ λx: x; +✎ [1, "two", true, [3, 4], ⊥]; +✎ []; +✎ [id]; diff --git a/conformance/corpus/012_lambda_basics/expected.out b/conformance/corpus/012_lambda_basics/expected.out new file mode 100644 index 0000000..7359be9 --- /dev/null +++ b/conformance/corpus/012_lambda_basics/expected.out @@ -0,0 +1,3 @@ +λ +7 +1 diff --git a/conformance/corpus/012_lambda_basics/meta.json b/conformance/corpus/012_lambda_basics/meta.json new file mode 100644 index 0000000..6efb34d --- /dev/null +++ b/conformance/corpus/012_lambda_basics/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "λ definition, display, application, multiple parameters"} diff --git a/conformance/corpus/012_lambda_basics/program.mpl b/conformance/corpus/012_lambda_basics/program.mpl new file mode 100644 index 0000000..5fbc1c8 --- /dev/null +++ b/conformance/corpus/012_lambda_basics/program.mpl @@ -0,0 +1,5 @@ +id ≜ λx: x; +✎ id; +✎ id(7); +fst ≜ λa, b: a; +✎ fst(1, 2); diff --git a/conformance/corpus/013_closure_capture/expected.out b/conformance/corpus/013_closure_capture/expected.out new file mode 100644 index 0000000..b07697d --- /dev/null +++ b/conformance/corpus/013_closure_capture/expected.out @@ -0,0 +1,2 @@ +11 +21 diff --git a/conformance/corpus/013_closure_capture/meta.json b/conformance/corpus/013_closure_capture/meta.json new file mode 100644 index 0000000..2775bc7 --- /dev/null +++ b/conformance/corpus/013_closure_capture/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "closures capture the environment, not values at definition time"} diff --git a/conformance/corpus/013_closure_capture/program.mpl b/conformance/corpus/013_closure_capture/program.mpl new file mode 100644 index 0000000..1327bf6 --- /dev/null +++ b/conformance/corpus/013_closure_capture/program.mpl @@ -0,0 +1,5 @@ +x ← 10; +f ≜ λy: x + y; +✎ f(1); +x ← 20; +✎ f(1); diff --git a/conformance/corpus/014_higher_order/expected.out b/conformance/corpus/014_higher_order/expected.out new file mode 100644 index 0000000..392be62 --- /dev/null +++ b/conformance/corpus/014_higher_order/expected.out @@ -0,0 +1,2 @@ +42 +15 diff --git a/conformance/corpus/014_higher_order/meta.json b/conformance/corpus/014_higher_order/meta.json new file mode 100644 index 0000000..9b5516d --- /dev/null +++ b/conformance/corpus/014_higher_order/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "curried application and λ literals as call arguments"} diff --git a/conformance/corpus/014_higher_order/program.mpl b/conformance/corpus/014_higher_order/program.mpl new file mode 100644 index 0000000..5f23ee5 --- /dev/null +++ b/conformance/corpus/014_higher_order/program.mpl @@ -0,0 +1,5 @@ +twice ≜ λf: λx: f(f(x)); +inc ≜ λn: n + 1; +✎ twice(inc)(40); +apply ≜ λf, v: f(v); +✎ apply(λn: n × 3, 5); diff --git a/conformance/corpus/015_recursion_fib/expected.out b/conformance/corpus/015_recursion_fib/expected.out new file mode 100644 index 0000000..c3f407c --- /dev/null +++ b/conformance/corpus/015_recursion_fib/expected.out @@ -0,0 +1 @@ +55 diff --git a/conformance/corpus/015_recursion_fib/meta.json b/conformance/corpus/015_recursion_fib/meta.json new file mode 100644 index 0000000..775ebbb --- /dev/null +++ b/conformance/corpus/015_recursion_fib/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "binary recursion through a guarded alternative"} diff --git a/conformance/corpus/015_recursion_fib/program.mpl b/conformance/corpus/015_recursion_fib/program.mpl new file mode 100644 index 0000000..d850b8a --- /dev/null +++ b/conformance/corpus/015_recursion_fib/program.mpl @@ -0,0 +1,2 @@ +fib ≜ λn: (n ≤ 1 ⟹ n) | (fib(n - 1) + fib(n - 2)); +✎ fib(10); diff --git a/conformance/corpus/016_recursion_sum/expected.out b/conformance/corpus/016_recursion_sum/expected.out new file mode 100644 index 0000000..c7610df --- /dev/null +++ b/conformance/corpus/016_recursion_sum/expected.out @@ -0,0 +1 @@ +125250 diff --git a/conformance/corpus/016_recursion_sum/meta.json b/conformance/corpus/016_recursion_sum/meta.json new file mode 100644 index 0000000..3b6127b --- /dev/null +++ b/conformance/corpus/016_recursion_sum/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "linear recursion 500 deep (within the host stack)"} diff --git a/conformance/corpus/016_recursion_sum/program.mpl b/conformance/corpus/016_recursion_sum/program.mpl new file mode 100644 index 0000000..fe8d29f --- /dev/null +++ b/conformance/corpus/016_recursion_sum/program.mpl @@ -0,0 +1,2 @@ +sum ≜ λn: (n = 0 ⟹ 0) | (n + sum(n - 1)); +✎ sum(500); diff --git a/conformance/corpus/017_forall_accumulate/expected.out b/conformance/corpus/017_forall_accumulate/expected.out new file mode 100644 index 0000000..c3f407c --- /dev/null +++ b/conformance/corpus/017_forall_accumulate/expected.out @@ -0,0 +1 @@ +55 diff --git a/conformance/corpus/017_forall_accumulate/meta.json b/conformance/corpus/017_forall_accumulate/meta.json new file mode 100644 index 0000000..c400ee7 --- /dev/null +++ b/conformance/corpus/017_forall_accumulate/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "∀ with an accumulating assignment"} diff --git a/conformance/corpus/017_forall_accumulate/program.mpl b/conformance/corpus/017_forall_accumulate/program.mpl new file mode 100644 index 0000000..89156c7 --- /dev/null +++ b/conformance/corpus/017_forall_accumulate/program.mpl @@ -0,0 +1,3 @@ +t ← 0; +∀ n ∈ [1, 2, 3, 4, 5]: t ← t + n × n; +✎ t; diff --git a/conformance/corpus/018_forall_value/expected.out b/conformance/corpus/018_forall_value/expected.out new file mode 100644 index 0000000..eb3a635 --- /dev/null +++ b/conformance/corpus/018_forall_value/expected.out @@ -0,0 +1,2 @@ +6 +⊥ diff --git a/conformance/corpus/018_forall_value/meta.json b/conformance/corpus/018_forall_value/meta.json new file mode 100644 index 0000000..e89bcb6 --- /dev/null +++ b/conformance/corpus/018_forall_value/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "a ∀ expression yields the last body value; empty collection yields ⊥"} diff --git a/conformance/corpus/018_forall_value/program.mpl b/conformance/corpus/018_forall_value/program.mpl new file mode 100644 index 0000000..a75cc1b --- /dev/null +++ b/conformance/corpus/018_forall_value/program.mpl @@ -0,0 +1,2 @@ +✎(∀ n ∈ [1, 2, 3]: n × 2); +✎(∀ n ∈ []: n); diff --git a/conformance/corpus/019_forall_scope/expected.out b/conformance/corpus/019_forall_scope/expected.out new file mode 100644 index 0000000..040e114 --- /dev/null +++ b/conformance/corpus/019_forall_scope/expected.out @@ -0,0 +1,3 @@ +1 +2 +100 diff --git a/conformance/corpus/019_forall_scope/meta.json b/conformance/corpus/019_forall_scope/meta.json new file mode 100644 index 0000000..5e7c0d0 --- /dev/null +++ b/conformance/corpus/019_forall_scope/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "the ∀ variable shadows per iteration and the outer binding survives"} diff --git a/conformance/corpus/019_forall_scope/program.mpl b/conformance/corpus/019_forall_scope/program.mpl new file mode 100644 index 0000000..b43d2f3 --- /dev/null +++ b/conformance/corpus/019_forall_scope/program.mpl @@ -0,0 +1,3 @@ +n ← 100; +∀ n ∈ [1, 2]: ✎ n; +✎ n; diff --git a/conformance/corpus/020_guarded_alternatives/expected.out b/conformance/corpus/020_guarded_alternatives/expected.out new file mode 100644 index 0000000..b1e6722 --- /dev/null +++ b/conformance/corpus/020_guarded_alternatives/expected.out @@ -0,0 +1,3 @@ +A +B +C diff --git a/conformance/corpus/020_guarded_alternatives/meta.json b/conformance/corpus/020_guarded_alternatives/meta.json new file mode 100644 index 0000000..c49112f --- /dev/null +++ b/conformance/corpus/020_guarded_alternatives/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "the canonical conditional: guarded alternatives with fallback"} diff --git a/conformance/corpus/020_guarded_alternatives/program.mpl b/conformance/corpus/020_guarded_alternatives/program.mpl new file mode 100644 index 0000000..7a34721 --- /dev/null +++ b/conformance/corpus/020_guarded_alternatives/program.mpl @@ -0,0 +1,4 @@ +grade ≜ λs: (s ≥ 90 ⟹ "A") | ((s ≥ 80 ⟹ "B") | "C"); +✎ grade(95); +✎ grade(85); +✎ grade(70); diff --git a/conformance/corpus/021_no_guard_match/expected.out b/conformance/corpus/021_no_guard_match/expected.out new file mode 100644 index 0000000..ab6c322 --- /dev/null +++ b/conformance/corpus/021_no_guard_match/expected.out @@ -0,0 +1,2 @@ +⊥ +⊥ diff --git a/conformance/corpus/021_no_guard_match/meta.json b/conformance/corpus/021_no_guard_match/meta.json new file mode 100644 index 0000000..62fb3c1 --- /dev/null +++ b/conformance/corpus/021_no_guard_match/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "a guard that never fires, with no | fallback, surfaces as ⊥"} diff --git a/conformance/corpus/021_no_guard_match/program.mpl b/conformance/corpus/021_no_guard_match/program.mpl new file mode 100644 index 0000000..db30732 --- /dev/null +++ b/conformance/corpus/021_no_guard_match/program.mpl @@ -0,0 +1,3 @@ +✎((false ⟹ 1)); +x ← (false ⟹ 1); +✎ x; diff --git a/conformance/corpus/022_guard_truthiness/expected.out b/conformance/corpus/022_guard_truthiness/expected.out new file mode 100644 index 0000000..daa2f97 --- /dev/null +++ b/conformance/corpus/022_guard_truthiness/expected.out @@ -0,0 +1,5 @@ +one +no +num +no +no diff --git a/conformance/corpus/022_guard_truthiness/meta.json b/conformance/corpus/022_guard_truthiness/meta.json new file mode 100644 index 0000000..1263dae --- /dev/null +++ b/conformance/corpus/022_guard_truthiness/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "guard conditions: true or non-zero number fire; strings/lists never do"} diff --git a/conformance/corpus/022_guard_truthiness/program.mpl b/conformance/corpus/022_guard_truthiness/program.mpl new file mode 100644 index 0000000..1b54b0b --- /dev/null +++ b/conformance/corpus/022_guard_truthiness/program.mpl @@ -0,0 +1,5 @@ +✎((1 ⟹ "one") | "no"); +✎((0 ⟹ "zero") | "no"); +✎((2.5 ⟹ "num") | "no"); +✎(("s" ⟹ "str") | "no"); +✎(([1] ⟹ "list") | "no"); diff --git a/conformance/corpus/023_alt_chain/expected.out b/conformance/corpus/023_alt_chain/expected.out new file mode 100644 index 0000000..f1e5eee --- /dev/null +++ b/conformance/corpus/023_alt_chain/expected.out @@ -0,0 +1,2 @@ +3 +2 diff --git a/conformance/corpus/023_alt_chain/meta.json b/conformance/corpus/023_alt_chain/meta.json new file mode 100644 index 0000000..1fe51fc --- /dev/null +++ b/conformance/corpus/023_alt_chain/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "fall-through chains take the first firing arm"} diff --git a/conformance/corpus/023_alt_chain/program.mpl b/conformance/corpus/023_alt_chain/program.mpl new file mode 100644 index 0000000..75b5f45 --- /dev/null +++ b/conformance/corpus/023_alt_chain/program.mpl @@ -0,0 +1,2 @@ +✎((false ⟹ 1) | (false ⟹ 2) | 3); +✎((false ⟹ 1) | (true ⟹ 2) | 3); diff --git a/conformance/corpus/024_def_assign_rebind/expected.out b/conformance/corpus/024_def_assign_rebind/expected.out new file mode 100644 index 0000000..e0d13b0 --- /dev/null +++ b/conformance/corpus/024_def_assign_rebind/expected.out @@ -0,0 +1,4 @@ +1 +2 +3 +5 diff --git a/conformance/corpus/024_def_assign_rebind/meta.json b/conformance/corpus/024_def_assign_rebind/meta.json new file mode 100644 index 0000000..f129dcb --- /dev/null +++ b/conformance/corpus/024_def_assign_rebind/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "≜ and ← both rebind freely; ← works without a prior ≜"} diff --git a/conformance/corpus/024_def_assign_rebind/program.mpl b/conformance/corpus/024_def_assign_rebind/program.mpl new file mode 100644 index 0000000..22fa22b --- /dev/null +++ b/conformance/corpus/024_def_assign_rebind/program.mpl @@ -0,0 +1,8 @@ +x ≜ 1; +✎ x; +x ← 2; +✎ x; +x ≜ 3; +✎ x; +y ← 5; +✎ y; diff --git a/conformance/corpus/025_def_assign_value/expected.out b/conformance/corpus/025_def_assign_value/expected.out new file mode 100644 index 0000000..453dd6a --- /dev/null +++ b/conformance/corpus/025_def_assign_value/expected.out @@ -0,0 +1,4 @@ +7 +8 +2 +2 diff --git a/conformance/corpus/025_def_assign_value/meta.json b/conformance/corpus/025_def_assign_value/meta.json new file mode 100644 index 0000000..8a05f2d --- /dev/null +++ b/conformance/corpus/025_def_assign_value/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "both binding forms are expressions returning the bound value; ≜ chains right"} diff --git a/conformance/corpus/025_def_assign_value/program.mpl b/conformance/corpus/025_def_assign_value/program.mpl new file mode 100644 index 0000000..84bcb60 --- /dev/null +++ b/conformance/corpus/025_def_assign_value/program.mpl @@ -0,0 +1,5 @@ +✎(a ≜ 7); +✎(a ← 8); +b ≜ c ≜ 2; +✎ b; +✎ c; diff --git a/conformance/corpus/026_def_vs_assign_scope/expected.out b/conformance/corpus/026_def_vs_assign_scope/expected.out new file mode 100644 index 0000000..4392deb --- /dev/null +++ b/conformance/corpus/026_def_vs_assign_scope/expected.out @@ -0,0 +1,2 @@ +99 +99 diff --git a/conformance/corpus/026_def_vs_assign_scope/meta.json b/conformance/corpus/026_def_vs_assign_scope/meta.json new file mode 100644 index 0000000..d59d753 --- /dev/null +++ b/conformance/corpus/026_def_vs_assign_scope/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "inside a λ, ← mutates the captured outer binding; ≜ creates a local one"} diff --git a/conformance/corpus/026_def_vs_assign_scope/program.mpl b/conformance/corpus/026_def_vs_assign_scope/program.mpl new file mode 100644 index 0000000..09640d9 --- /dev/null +++ b/conformance/corpus/026_def_vs_assign_scope/program.mpl @@ -0,0 +1,7 @@ +x ← 1; +f ≜ λy: {x ← 99; x}; +f(0); +✎ x; +g ≜ λy: {x ≜ 55; x}; +g(0); +✎ x; diff --git a/conformance/corpus/027_block_sequencing/expected.out b/conformance/corpus/027_block_sequencing/expected.out new file mode 100644 index 0000000..0dbf973 --- /dev/null +++ b/conformance/corpus/027_block_sequencing/expected.out @@ -0,0 +1,3 @@ +3 +⊥ +4 diff --git a/conformance/corpus/027_block_sequencing/meta.json b/conformance/corpus/027_block_sequencing/meta.json new file mode 100644 index 0000000..04d1664 --- /dev/null +++ b/conformance/corpus/027_block_sequencing/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "a block yields its last expression; {} yields ⊥; trailing ; permitted"} diff --git a/conformance/corpus/027_block_sequencing/program.mpl b/conformance/corpus/027_block_sequencing/program.mpl new file mode 100644 index 0000000..a274be8 --- /dev/null +++ b/conformance/corpus/027_block_sequencing/program.mpl @@ -0,0 +1,3 @@ +✎({1; 2; 3}); +✎({}); +✎({4;}); diff --git a/conformance/corpus/028_block_no_scope/expected.out b/conformance/corpus/028_block_no_scope/expected.out new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/conformance/corpus/028_block_no_scope/expected.out @@ -0,0 +1 @@ +9 diff --git a/conformance/corpus/028_block_no_scope/meta.json b/conformance/corpus/028_block_no_scope/meta.json new file mode 100644 index 0000000..5c12bd7 --- /dev/null +++ b/conformance/corpus/028_block_no_scope/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "braces do NOT create a scope: bindings made inside leak out"} diff --git a/conformance/corpus/028_block_no_scope/program.mpl b/conformance/corpus/028_block_no_scope/program.mpl new file mode 100644 index 0000000..295a93c --- /dev/null +++ b/conformance/corpus/028_block_no_scope/program.mpl @@ -0,0 +1,2 @@ +{y ← 9; 0}; +✎ y; diff --git a/conformance/corpus/029_comments/expected.out b/conformance/corpus/029_comments/expected.out new file mode 100644 index 0000000..01e79c3 --- /dev/null +++ b/conformance/corpus/029_comments/expected.out @@ -0,0 +1,3 @@ +1 +2 +3 diff --git a/conformance/corpus/029_comments/meta.json b/conformance/corpus/029_comments/meta.json new file mode 100644 index 0000000..f0d84b8 --- /dev/null +++ b/conformance/corpus/029_comments/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "line comments and nested block comments"} diff --git a/conformance/corpus/029_comments/program.mpl b/conformance/corpus/029_comments/program.mpl new file mode 100644 index 0000000..9cc3f1b --- /dev/null +++ b/conformance/corpus/029_comments/program.mpl @@ -0,0 +1,4 @@ +-- line comment +✎ 1; {- block -} ✎ 2; +{- outer {- nested -} outer -} +✎ 3; diff --git a/conformance/corpus/030_bot/expected.out b/conformance/corpus/030_bot/expected.out new file mode 100644 index 0000000..1ac1e33 --- /dev/null +++ b/conformance/corpus/030_bot/expected.out @@ -0,0 +1,3 @@ +⊥ +x⊥ +[⊥, 1] diff --git a/conformance/corpus/030_bot/meta.json b/conformance/corpus/030_bot/meta.json new file mode 100644 index 0000000..5a494ab --- /dev/null +++ b/conformance/corpus/030_bot/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "⊥ displays as ⊥ and concatenates/nests as a value"} diff --git a/conformance/corpus/030_bot/program.mpl b/conformance/corpus/030_bot/program.mpl new file mode 100644 index 0000000..70017a5 --- /dev/null +++ b/conformance/corpus/030_bot/program.mpl @@ -0,0 +1,3 @@ +✎ ⊥; +✎("x" + ⊥); +✎ [⊥, 1]; diff --git a/conformance/corpus/031_show_all_types/expected.out b/conformance/corpus/031_show_all_types/expected.out new file mode 100644 index 0000000..4aaf516 --- /dev/null +++ b/conformance/corpus/031_show_all_types/expected.out @@ -0,0 +1,8 @@ +42 +1.5 +s +true +false +[1] +⊥ +λ diff --git a/conformance/corpus/031_show_all_types/meta.json b/conformance/corpus/031_show_all_types/meta.json new file mode 100644 index 0000000..ffb7574 --- /dev/null +++ b/conformance/corpus/031_show_all_types/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "one ✎ per value type"} diff --git a/conformance/corpus/031_show_all_types/program.mpl b/conformance/corpus/031_show_all_types/program.mpl new file mode 100644 index 0000000..4bfe2fd --- /dev/null +++ b/conformance/corpus/031_show_all_types/program.mpl @@ -0,0 +1,9 @@ +f ≜ λx: x; +✎ 42; +✎ 1.5; +✎ "s"; +✎ true; +✎ false; +✎ [1]; +✎ ⊥; +✎ f; diff --git a/conformance/corpus/032_comparisons/expected.out b/conformance/corpus/032_comparisons/expected.out new file mode 100644 index 0000000..064310a --- /dev/null +++ b/conformance/corpus/032_comparisons/expected.out @@ -0,0 +1,6 @@ +true +true +false +false +true +true diff --git a/conformance/corpus/032_comparisons/meta.json b/conformance/corpus/032_comparisons/meta.json new file mode 100644 index 0000000..2b0410b --- /dev/null +++ b/conformance/corpus/032_comparisons/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "all six comparison operators on numbers"} diff --git a/conformance/corpus/032_comparisons/program.mpl b/conformance/corpus/032_comparisons/program.mpl new file mode 100644 index 0000000..5f85b07 --- /dev/null +++ b/conformance/corpus/032_comparisons/program.mpl @@ -0,0 +1,6 @@ +✎(1 < 2); +✎(2 ≤ 2); +✎(3 > 4); +✎(4 ≥ 5); +✎(1 = 1); +✎(1 ≠ 2); diff --git a/conformance/corpus/033_string_compare/expected.out b/conformance/corpus/033_string_compare/expected.out new file mode 100644 index 0000000..1140ff5 --- /dev/null +++ b/conformance/corpus/033_string_compare/expected.out @@ -0,0 +1,4 @@ +true +true +true +true diff --git a/conformance/corpus/033_string_compare/meta.json b/conformance/corpus/033_string_compare/meta.json new file mode 100644 index 0000000..fb961a8 --- /dev/null +++ b/conformance/corpus/033_string_compare/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "lexicographic order and structural equality on strings"} diff --git a/conformance/corpus/033_string_compare/program.mpl b/conformance/corpus/033_string_compare/program.mpl new file mode 100644 index 0000000..602bf17 --- /dev/null +++ b/conformance/corpus/033_string_compare/program.mpl @@ -0,0 +1,4 @@ +✎("a" < "b"); +✎("abc" = "abc"); +✎("abc" ≠ "abd"); +✎("b" ≥ "a"); diff --git a/conformance/corpus/034_cross_type_equality/expected.out b/conformance/corpus/034_cross_type_equality/expected.out new file mode 100644 index 0000000..40f7abf --- /dev/null +++ b/conformance/corpus/034_cross_type_equality/expected.out @@ -0,0 +1,6 @@ +false +false +true +true +true +false diff --git a/conformance/corpus/034_cross_type_equality/meta.json b/conformance/corpus/034_cross_type_equality/meta.json new file mode 100644 index 0000000..cf3b8ef --- /dev/null +++ b/conformance/corpus/034_cross_type_equality/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "equality is structural per type and false across types; ⊥ equals ⊥"} diff --git a/conformance/corpus/034_cross_type_equality/program.mpl b/conformance/corpus/034_cross_type_equality/program.mpl new file mode 100644 index 0000000..ede0171 --- /dev/null +++ b/conformance/corpus/034_cross_type_equality/program.mpl @@ -0,0 +1,6 @@ +✎(1 = "1"); +✎(true = 1); +✎([1] = [1]); +✎([] = []); +✎(⊥ = ⊥); +✎("" = ⊥); diff --git a/conformance/corpus/035_mixed_compare/expected.out b/conformance/corpus/035_mixed_compare/expected.out new file mode 100644 index 0000000..87f8d93 --- /dev/null +++ b/conformance/corpus/035_mixed_compare/expected.out @@ -0,0 +1,3 @@ +true +false +true diff --git a/conformance/corpus/035_mixed_compare/meta.json b/conformance/corpus/035_mixed_compare/meta.json new file mode 100644 index 0000000..f663cf5 --- /dev/null +++ b/conformance/corpus/035_mixed_compare/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "ordering across types follows host coercion — observed, flagged as a judgment call"} diff --git a/conformance/corpus/035_mixed_compare/program.mpl b/conformance/corpus/035_mixed_compare/program.mpl new file mode 100644 index 0000000..2bcea56 --- /dev/null +++ b/conformance/corpus/035_mixed_compare/program.mpl @@ -0,0 +1,3 @@ +✎(1 < "2"); +✎("10" < 9); +✎(true < 2); diff --git a/conformance/corpus/036_logic_ops/expected.out b/conformance/corpus/036_logic_ops/expected.out new file mode 100644 index 0000000..62b4804 --- /dev/null +++ b/conformance/corpus/036_logic_ops/expected.out @@ -0,0 +1,7 @@ +true +false +true +false +false +true +false diff --git a/conformance/corpus/036_logic_ops/meta.json b/conformance/corpus/036_logic_ops/meta.json new file mode 100644 index 0000000..76be753 --- /dev/null +++ b/conformance/corpus/036_logic_ops/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "∧ ∨ test operands with strict boolean truth — numbers are not truthy here"} diff --git a/conformance/corpus/036_logic_ops/program.mpl b/conformance/corpus/036_logic_ops/program.mpl new file mode 100644 index 0000000..7832bb2 --- /dev/null +++ b/conformance/corpus/036_logic_ops/program.mpl @@ -0,0 +1,7 @@ +✎(true ∧ true); +✎(true ∧ false); +✎(false ∨ true); +✎(false ∨ false); +✎(1 ∧ true); +✎(0 ∨ true); +✎(true ∧ 1); diff --git a/conformance/corpus/037_logic_short_circuit/expected.out b/conformance/corpus/037_logic_short_circuit/expected.out new file mode 100644 index 0000000..bb5ee5c --- /dev/null +++ b/conformance/corpus/037_logic_short_circuit/expected.out @@ -0,0 +1,3 @@ +0 +0 +1 diff --git a/conformance/corpus/037_logic_short_circuit/meta.json b/conformance/corpus/037_logic_short_circuit/meta.json new file mode 100644 index 0000000..bd53f1c --- /dev/null +++ b/conformance/corpus/037_logic_short_circuit/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "∧ skips its right side on false; ∨ skips it on true (observable via side effect)"} diff --git a/conformance/corpus/037_logic_short_circuit/program.mpl b/conformance/corpus/037_logic_short_circuit/program.mpl new file mode 100644 index 0000000..1971128 --- /dev/null +++ b/conformance/corpus/037_logic_short_circuit/program.mpl @@ -0,0 +1,8 @@ +x ← 0; +f ≜ λv: {x ← x + 1; v}; +false ∧ f(true); +✎ x; +true ∨ f(true); +✎ x; +true ∧ f(true); +✎ x; diff --git a/conformance/corpus/038_ascii_escapes/expected.out b/conformance/corpus/038_ascii_escapes/expected.out new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/conformance/corpus/038_ascii_escapes/expected.out @@ -0,0 +1 @@ +24 diff --git a/conformance/corpus/038_ascii_escapes/meta.json b/conformance/corpus/038_ascii_escapes/meta.json new file mode 100644 index 0000000..19b8bdc --- /dev/null +++ b/conformance/corpus/038_ascii_escapes/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "a program written entirely in ASCII escapes behaves like its glyph spelling"} diff --git a/conformance/corpus/038_ascii_escapes/program.mpl b/conformance/corpus/038_ascii_escapes/program.mpl new file mode 100644 index 0000000..5323b1e --- /dev/null +++ b/conformance/corpus/038_ascii_escapes/program.mpl @@ -0,0 +1,2 @@ +f \coloneq \lambda n: (n \leq 1 \implies 1) | (n \times f(n - 1)); +\trace f(4); diff --git a/conformance/corpus/039_type_constraint_unenforced/expected.out b/conformance/corpus/039_type_constraint_unenforced/expected.out new file mode 100644 index 0000000..a123a3a --- /dev/null +++ b/conformance/corpus/039_type_constraint_unenforced/expected.out @@ -0,0 +1,2 @@ +2 +hi! diff --git a/conformance/corpus/039_type_constraint_unenforced/meta.json b/conformance/corpus/039_type_constraint_unenforced/meta.json new file mode 100644 index 0000000..d18156a --- /dev/null +++ b/conformance/corpus/039_type_constraint_unenforced/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "∈-constraints parse (incl. supplementary-plane 𝔹) and are discarded unevaluated"} diff --git a/conformance/corpus/039_type_constraint_unenforced/program.mpl b/conformance/corpus/039_type_constraint_unenforced/program.mpl new file mode 100644 index 0000000..829efe3 --- /dev/null +++ b/conformance/corpus/039_type_constraint_unenforced/program.mpl @@ -0,0 +1,4 @@ +f ≜ λx∈ℕ: x + 1; +✎ f(1); +g ≜ λs∈𝔹: s + "!"; +✎ g("hi"); diff --git a/conformance/corpus/040_trace_returns_value/expected.out b/conformance/corpus/040_trace_returns_value/expected.out new file mode 100644 index 0000000..b40f8fa --- /dev/null +++ b/conformance/corpus/040_trace_returns_value/expected.out @@ -0,0 +1,4 @@ +5 +5 +side +side diff --git a/conformance/corpus/040_trace_returns_value/meta.json b/conformance/corpus/040_trace_returns_value/meta.json new file mode 100644 index 0000000..ed90ab8 --- /dev/null +++ b/conformance/corpus/040_trace_returns_value/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "✎ is an expression: prints and returns its operand"} diff --git a/conformance/corpus/040_trace_returns_value/program.mpl b/conformance/corpus/040_trace_returns_value/program.mpl new file mode 100644 index 0000000..6d3d8e7 --- /dev/null +++ b/conformance/corpus/040_trace_returns_value/program.mpl @@ -0,0 +1,3 @@ +✎(✎ 5); +v ← ✎ "side"; +✎ v; diff --git a/conformance/corpus/041_asterisk_multiplication/expected.out b/conformance/corpus/041_asterisk_multiplication/expected.out new file mode 100644 index 0000000..184d152 --- /dev/null +++ b/conformance/corpus/041_asterisk_multiplication/expected.out @@ -0,0 +1,2 @@ +12 +5 diff --git a/conformance/corpus/041_asterisk_multiplication/meta.json b/conformance/corpus/041_asterisk_multiplication/meta.json new file mode 100644 index 0000000..b8b337b --- /dev/null +++ b/conformance/corpus/041_asterisk_multiplication/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "∗ (U+2217) is multiplication, same as ×"} diff --git a/conformance/corpus/041_asterisk_multiplication/program.mpl b/conformance/corpus/041_asterisk_multiplication/program.mpl new file mode 100644 index 0000000..9400f9e --- /dev/null +++ b/conformance/corpus/041_asterisk_multiplication/program.mpl @@ -0,0 +1,2 @@ +✎(3 ∗ 4); +✎(2 ∗ 2.5); diff --git a/conformance/corpus/042_nested_calls_in_list/expected.out b/conformance/corpus/042_nested_calls_in_list/expected.out new file mode 100644 index 0000000..0c709c0 --- /dev/null +++ b/conformance/corpus/042_nested_calls_in_list/expected.out @@ -0,0 +1 @@ +[11, 12] diff --git a/conformance/corpus/042_nested_calls_in_list/meta.json b/conformance/corpus/042_nested_calls_in_list/meta.json new file mode 100644 index 0000000..14c76ac --- /dev/null +++ b/conformance/corpus/042_nested_calls_in_list/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "calls inside list literals; λ argument"} diff --git a/conformance/corpus/042_nested_calls_in_list/program.mpl b/conformance/corpus/042_nested_calls_in_list/program.mpl new file mode 100644 index 0000000..0f3eb89 --- /dev/null +++ b/conformance/corpus/042_nested_calls_in_list/program.mpl @@ -0,0 +1,2 @@ +m ≜ λf: [f(1), f(2)]; +✎ m(λn: n + 10); diff --git a/conformance/corpus/043_div_zero/expected.err b/conformance/corpus/043_div_zero/expected.err new file mode 100644 index 0000000..97bc860 --- /dev/null +++ b/conformance/corpus/043_div_zero/expected.err @@ -0,0 +1 @@ +err_div0 diff --git a/conformance/corpus/043_div_zero/meta.json b/conformance/corpus/043_div_zero/meta.json new file mode 100644 index 0000000..03feaba --- /dev/null +++ b/conformance/corpus/043_div_zero/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "division by zero"} diff --git a/conformance/corpus/043_div_zero/program.mpl b/conformance/corpus/043_div_zero/program.mpl new file mode 100644 index 0000000..17c937c --- /dev/null +++ b/conformance/corpus/043_div_zero/program.mpl @@ -0,0 +1 @@ +✎(1 ÷ 0); diff --git a/conformance/corpus/044_undef/expected.err b/conformance/corpus/044_undef/expected.err new file mode 100644 index 0000000..b393835 --- /dev/null +++ b/conformance/corpus/044_undef/expected.err @@ -0,0 +1 @@ +err_undef diff --git a/conformance/corpus/044_undef/meta.json b/conformance/corpus/044_undef/meta.json new file mode 100644 index 0000000..757b05a --- /dev/null +++ b/conformance/corpus/044_undef/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "unbound identifier"} diff --git a/conformance/corpus/044_undef/program.mpl b/conformance/corpus/044_undef/program.mpl new file mode 100644 index 0000000..2356297 --- /dev/null +++ b/conformance/corpus/044_undef/program.mpl @@ -0,0 +1 @@ +✎ nope; diff --git a/conformance/corpus/045_notfn/expected.err b/conformance/corpus/045_notfn/expected.err new file mode 100644 index 0000000..bf3ac71 --- /dev/null +++ b/conformance/corpus/045_notfn/expected.err @@ -0,0 +1 @@ +err_notfn diff --git a/conformance/corpus/045_notfn/meta.json b/conformance/corpus/045_notfn/meta.json new file mode 100644 index 0000000..061dcc8 --- /dev/null +++ b/conformance/corpus/045_notfn/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "calling a non-closure"} diff --git a/conformance/corpus/045_notfn/program.mpl b/conformance/corpus/045_notfn/program.mpl new file mode 100644 index 0000000..1f1c9f4 --- /dev/null +++ b/conformance/corpus/045_notfn/program.mpl @@ -0,0 +1,2 @@ +x ≜ 5; +x(1); diff --git a/conformance/corpus/046_arity_nullary/expected.err b/conformance/corpus/046_arity_nullary/expected.err new file mode 100644 index 0000000..e6e3387 --- /dev/null +++ b/conformance/corpus/046_arity_nullary/expected.err @@ -0,0 +1 @@ +err_arity diff --git a/conformance/corpus/046_arity_nullary/meta.json b/conformance/corpus/046_arity_nullary/meta.json new file mode 100644 index 0000000..d559fd9 --- /dev/null +++ b/conformance/corpus/046_arity_nullary/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "nullary call syntax parses; arity is checked at runtime"} diff --git a/conformance/corpus/046_arity_nullary/program.mpl b/conformance/corpus/046_arity_nullary/program.mpl new file mode 100644 index 0000000..c2f612a --- /dev/null +++ b/conformance/corpus/046_arity_nullary/program.mpl @@ -0,0 +1,2 @@ +f ≜ λx: x; +f(); diff --git a/conformance/corpus/047_arity_extra/expected.err b/conformance/corpus/047_arity_extra/expected.err new file mode 100644 index 0000000..e6e3387 --- /dev/null +++ b/conformance/corpus/047_arity_extra/expected.err @@ -0,0 +1 @@ +err_arity diff --git a/conformance/corpus/047_arity_extra/meta.json b/conformance/corpus/047_arity_extra/meta.json new file mode 100644 index 0000000..cc2f755 --- /dev/null +++ b/conformance/corpus/047_arity_extra/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "too many arguments"} diff --git a/conformance/corpus/047_arity_extra/program.mpl b/conformance/corpus/047_arity_extra/program.mpl new file mode 100644 index 0000000..234af56 --- /dev/null +++ b/conformance/corpus/047_arity_extra/program.mpl @@ -0,0 +1,2 @@ +f ≜ λa: a; +f(1, 2); diff --git a/conformance/corpus/048_iter_nonlist/expected.err b/conformance/corpus/048_iter_nonlist/expected.err new file mode 100644 index 0000000..4b8f125 --- /dev/null +++ b/conformance/corpus/048_iter_nonlist/expected.err @@ -0,0 +1 @@ +err_iter diff --git a/conformance/corpus/048_iter_nonlist/meta.json b/conformance/corpus/048_iter_nonlist/meta.json new file mode 100644 index 0000000..3acf0ba --- /dev/null +++ b/conformance/corpus/048_iter_nonlist/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "∀ over a non-list"} diff --git a/conformance/corpus/048_iter_nonlist/program.mpl b/conformance/corpus/048_iter_nonlist/program.mpl new file mode 100644 index 0000000..b5f964a --- /dev/null +++ b/conformance/corpus/048_iter_nonlist/program.mpl @@ -0,0 +1 @@ +∀ x ∈ 5: x; diff --git a/conformance/corpus/049_num_bool_plus/expected.err b/conformance/corpus/049_num_bool_plus/expected.err new file mode 100644 index 0000000..fb9e88e --- /dev/null +++ b/conformance/corpus/049_num_bool_plus/expected.err @@ -0,0 +1 @@ +err_num diff --git a/conformance/corpus/049_num_bool_plus/meta.json b/conformance/corpus/049_num_bool_plus/meta.json new file mode 100644 index 0000000..4e48511 --- /dev/null +++ b/conformance/corpus/049_num_bool_plus/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "numeric + with a non-number, non-string operand"} diff --git a/conformance/corpus/049_num_bool_plus/program.mpl b/conformance/corpus/049_num_bool_plus/program.mpl new file mode 100644 index 0000000..7e2d989 --- /dev/null +++ b/conformance/corpus/049_num_bool_plus/program.mpl @@ -0,0 +1 @@ +✎(true + 1); diff --git a/conformance/corpus/050_num_string_minus/expected.err b/conformance/corpus/050_num_string_minus/expected.err new file mode 100644 index 0000000..fb9e88e --- /dev/null +++ b/conformance/corpus/050_num_string_minus/expected.err @@ -0,0 +1 @@ +err_num diff --git a/conformance/corpus/050_num_string_minus/meta.json b/conformance/corpus/050_num_string_minus/meta.json new file mode 100644 index 0000000..b905b87 --- /dev/null +++ b/conformance/corpus/050_num_string_minus/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "- is numeric only, no string analog"} diff --git a/conformance/corpus/050_num_string_minus/program.mpl b/conformance/corpus/050_num_string_minus/program.mpl new file mode 100644 index 0000000..7a45f92 --- /dev/null +++ b/conformance/corpus/050_num_string_minus/program.mpl @@ -0,0 +1 @@ +✎("a" - "b"); diff --git a/conformance/corpus/051_neg_string/expected.err b/conformance/corpus/051_neg_string/expected.err new file mode 100644 index 0000000..fb9e88e --- /dev/null +++ b/conformance/corpus/051_neg_string/expected.err @@ -0,0 +1 @@ +err_num diff --git a/conformance/corpus/051_neg_string/meta.json b/conformance/corpus/051_neg_string/meta.json new file mode 100644 index 0000000..4fd2a87 --- /dev/null +++ b/conformance/corpus/051_neg_string/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "unary minus is numeric only"} diff --git a/conformance/corpus/051_neg_string/program.mpl b/conformance/corpus/051_neg_string/program.mpl new file mode 100644 index 0000000..3f60494 --- /dev/null +++ b/conformance/corpus/051_neg_string/program.mpl @@ -0,0 +1 @@ +✎(-"a"); diff --git a/conformance/corpus/052_bot_arith/expected.err b/conformance/corpus/052_bot_arith/expected.err new file mode 100644 index 0000000..fb9e88e --- /dev/null +++ b/conformance/corpus/052_bot_arith/expected.err @@ -0,0 +1 @@ +err_num diff --git a/conformance/corpus/052_bot_arith/meta.json b/conformance/corpus/052_bot_arith/meta.json new file mode 100644 index 0000000..81003ad --- /dev/null +++ b/conformance/corpus/052_bot_arith/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "arithmetic on ⊥"} diff --git a/conformance/corpus/052_bot_arith/program.mpl b/conformance/corpus/052_bot_arith/program.mpl new file mode 100644 index 0000000..0d89c15 --- /dev/null +++ b/conformance/corpus/052_bot_arith/program.mpl @@ -0,0 +1 @@ +✎(⊥ + 1); diff --git a/conformance/corpus/053_step_budget/expected.err b/conformance/corpus/053_step_budget/expected.err new file mode 100644 index 0000000..ca3794f --- /dev/null +++ b/conformance/corpus/053_step_budget/expected.err @@ -0,0 +1 @@ +err_steps diff --git a/conformance/corpus/053_step_budget/meta.json b/conformance/corpus/053_step_budget/meta.json new file mode 100644 index 0000000..b65737a --- /dev/null +++ b/conformance/corpus/053_step_budget/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "the 500000-step evaluation budget"} diff --git a/conformance/corpus/053_step_budget/program.mpl b/conformance/corpus/053_step_budget/program.mpl new file mode 100644 index 0000000..963c5c5 --- /dev/null +++ b/conformance/corpus/053_step_budget/program.mpl @@ -0,0 +1,2 @@ +l ← [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; +∀ a ∈ l: ∀ b ∈ l: ∀ c ∈ l: ∀ d ∈ l: ∀ e ∈ l: ∀ f ∈ l: 0; diff --git a/conformance/corpus/054_reject_underscore_ident/expected.err b/conformance/corpus/054_reject_underscore_ident/expected.err new file mode 100644 index 0000000..7cb868b --- /dev/null +++ b/conformance/corpus/054_reject_underscore_ident/expected.err @@ -0,0 +1 @@ +err_char diff --git a/conformance/corpus/054_reject_underscore_ident/meta.json b/conformance/corpus/054_reject_underscore_ident/meta.json new file mode 100644 index 0000000..5f1b8c4 --- /dev/null +++ b/conformance/corpus/054_reject_underscore_ident/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "identifiers may not start with _"} diff --git a/conformance/corpus/054_reject_underscore_ident/program.mpl b/conformance/corpus/054_reject_underscore_ident/program.mpl new file mode 100644 index 0000000..d724212 --- /dev/null +++ b/conformance/corpus/054_reject_underscore_ident/program.mpl @@ -0,0 +1 @@ +_x ← 1; diff --git a/conformance/corpus/055_reject_juxtaposition/expected.err b/conformance/corpus/055_reject_juxtaposition/expected.err new file mode 100644 index 0000000..67ce62a --- /dev/null +++ b/conformance/corpus/055_reject_juxtaposition/expected.err @@ -0,0 +1 @@ +err_expect diff --git a/conformance/corpus/055_reject_juxtaposition/meta.json b/conformance/corpus/055_reject_juxtaposition/meta.json new file mode 100644 index 0000000..aef7e53 --- /dev/null +++ b/conformance/corpus/055_reject_juxtaposition/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "juxtaposition call f x is not a call syntax"} diff --git a/conformance/corpus/055_reject_juxtaposition/program.mpl b/conformance/corpus/055_reject_juxtaposition/program.mpl new file mode 100644 index 0000000..d30f1d7 --- /dev/null +++ b/conformance/corpus/055_reject_juxtaposition/program.mpl @@ -0,0 +1,2 @@ +f ≜ λn: n; +f 5; diff --git a/conformance/corpus/056_reject_ternary/expected.err b/conformance/corpus/056_reject_ternary/expected.err new file mode 100644 index 0000000..7cb868b --- /dev/null +++ b/conformance/corpus/056_reject_ternary/expected.err @@ -0,0 +1 @@ +err_char diff --git a/conformance/corpus/056_reject_ternary/meta.json b/conformance/corpus/056_reject_ternary/meta.json new file mode 100644 index 0000000..6b0dcc1 --- /dev/null +++ b/conformance/corpus/056_reject_ternary/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "no ternary; conditionals are guarded alternatives"} diff --git a/conformance/corpus/056_reject_ternary/program.mpl b/conformance/corpus/056_reject_ternary/program.mpl new file mode 100644 index 0000000..f23b8af --- /dev/null +++ b/conformance/corpus/056_reject_ternary/program.mpl @@ -0,0 +1,2 @@ +x ≜ true; +✎(x ? 1 : 0); diff --git a/conformance/corpus/057_reject_output_emoji/expected.err b/conformance/corpus/057_reject_output_emoji/expected.err new file mode 100644 index 0000000..7cb868b --- /dev/null +++ b/conformance/corpus/057_reject_output_emoji/expected.err @@ -0,0 +1 @@ +err_char diff --git a/conformance/corpus/057_reject_output_emoji/meta.json b/conformance/corpus/057_reject_output_emoji/meta.json new file mode 100644 index 0000000..701bed6 --- /dev/null +++ b/conformance/corpus/057_reject_output_emoji/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "output is ✎ only"} diff --git a/conformance/corpus/057_reject_output_emoji/program.mpl b/conformance/corpus/057_reject_output_emoji/program.mpl new file mode 100644 index 0000000..2830c94 --- /dev/null +++ b/conformance/corpus/057_reject_output_emoji/program.mpl @@ -0,0 +1 @@ +📤 "hi"; diff --git a/conformance/corpus/058_reject_unterminated_string/expected.err b/conformance/corpus/058_reject_unterminated_string/expected.err new file mode 100644 index 0000000..9194637 --- /dev/null +++ b/conformance/corpus/058_reject_unterminated_string/expected.err @@ -0,0 +1 @@ +err_string diff --git a/conformance/corpus/058_reject_unterminated_string/meta.json b/conformance/corpus/058_reject_unterminated_string/meta.json new file mode 100644 index 0000000..85c85b5 --- /dev/null +++ b/conformance/corpus/058_reject_unterminated_string/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "unterminated string literal"} diff --git a/conformance/corpus/058_reject_unterminated_string/program.mpl b/conformance/corpus/058_reject_unterminated_string/program.mpl new file mode 100644 index 0000000..2013e6c --- /dev/null +++ b/conformance/corpus/058_reject_unterminated_string/program.mpl @@ -0,0 +1 @@ +✎ "abc; diff --git a/conformance/corpus/059_reject_unknown_escape/expected.err b/conformance/corpus/059_reject_unknown_escape/expected.err new file mode 100644 index 0000000..1955119 --- /dev/null +++ b/conformance/corpus/059_reject_unknown_escape/expected.err @@ -0,0 +1 @@ +err_escape diff --git a/conformance/corpus/059_reject_unknown_escape/meta.json b/conformance/corpus/059_reject_unknown_escape/meta.json new file mode 100644 index 0000000..b867720 --- /dev/null +++ b/conformance/corpus/059_reject_unknown_escape/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "unknown ASCII escape word"} diff --git a/conformance/corpus/059_reject_unknown_escape/program.mpl b/conformance/corpus/059_reject_unknown_escape/program.mpl new file mode 100644 index 0000000..1978605 --- /dev/null +++ b/conformance/corpus/059_reject_unknown_escape/program.mpl @@ -0,0 +1 @@ +\foo 1; diff --git a/conformance/corpus/060_reject_unmatched_brace/expected.err b/conformance/corpus/060_reject_unmatched_brace/expected.err new file mode 100644 index 0000000..67ce62a --- /dev/null +++ b/conformance/corpus/060_reject_unmatched_brace/expected.err @@ -0,0 +1 @@ +err_expect diff --git a/conformance/corpus/060_reject_unmatched_brace/meta.json b/conformance/corpus/060_reject_unmatched_brace/meta.json new file mode 100644 index 0000000..430d7f8 --- /dev/null +++ b/conformance/corpus/060_reject_unmatched_brace/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "unclosed brace"} diff --git a/conformance/corpus/060_reject_unmatched_brace/program.mpl b/conformance/corpus/060_reject_unmatched_brace/program.mpl new file mode 100644 index 0000000..9f1d2fc --- /dev/null +++ b/conformance/corpus/060_reject_unmatched_brace/program.mpl @@ -0,0 +1 @@ +{1; 2; diff --git a/conformance/corpus/061_reject_unterminated_comment/expected.err b/conformance/corpus/061_reject_unterminated_comment/expected.err new file mode 100644 index 0000000..01f0cb9 --- /dev/null +++ b/conformance/corpus/061_reject_unterminated_comment/expected.err @@ -0,0 +1 @@ +err_comment diff --git a/conformance/corpus/061_reject_unterminated_comment/meta.json b/conformance/corpus/061_reject_unterminated_comment/meta.json new file mode 100644 index 0000000..a55da84 --- /dev/null +++ b/conformance/corpus/061_reject_unterminated_comment/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "unterminated block comment"} diff --git a/conformance/corpus/061_reject_unterminated_comment/program.mpl b/conformance/corpus/061_reject_unterminated_comment/program.mpl new file mode 100644 index 0000000..dc5ec5a --- /dev/null +++ b/conformance/corpus/061_reject_unterminated_comment/program.mpl @@ -0,0 +1,2 @@ +{- never closed +✎ 1; diff --git a/conformance/corpus/062_reject_sum_token/expected.err b/conformance/corpus/062_reject_sum_token/expected.err new file mode 100644 index 0000000..7cb868b --- /dev/null +++ b/conformance/corpus/062_reject_sum_token/expected.err @@ -0,0 +1 @@ +err_char diff --git a/conformance/corpus/062_reject_sum_token/meta.json b/conformance/corpus/062_reject_sum_token/meta.json new file mode 100644 index 0000000..a28d51d --- /dev/null +++ b/conformance/corpus/062_reject_sum_token/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "∑ is M1, not a token"} diff --git a/conformance/corpus/062_reject_sum_token/program.mpl b/conformance/corpus/062_reject_sum_token/program.mpl new file mode 100644 index 0000000..3d2e592 --- /dev/null +++ b/conformance/corpus/062_reject_sum_token/program.mpl @@ -0,0 +1 @@ +✎(∑ [1, 2]); diff --git a/conformance/corpus/063_reject_sqrt_token/expected.err b/conformance/corpus/063_reject_sqrt_token/expected.err new file mode 100644 index 0000000..7cb868b --- /dev/null +++ b/conformance/corpus/063_reject_sqrt_token/expected.err @@ -0,0 +1 @@ +err_char diff --git a/conformance/corpus/063_reject_sqrt_token/meta.json b/conformance/corpus/063_reject_sqrt_token/meta.json new file mode 100644 index 0000000..ec79458 --- /dev/null +++ b/conformance/corpus/063_reject_sqrt_token/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "√ is M1, not a token"} diff --git a/conformance/corpus/063_reject_sqrt_token/program.mpl b/conformance/corpus/063_reject_sqrt_token/program.mpl new file mode 100644 index 0000000..135f6e8 --- /dev/null +++ b/conformance/corpus/063_reject_sqrt_token/program.mpl @@ -0,0 +1 @@ +✎(√4); diff --git a/conformance/corpus/064_reject_modulo/expected.err b/conformance/corpus/064_reject_modulo/expected.err new file mode 100644 index 0000000..7cb868b --- /dev/null +++ b/conformance/corpus/064_reject_modulo/expected.err @@ -0,0 +1 @@ +err_char diff --git a/conformance/corpus/064_reject_modulo/meta.json b/conformance/corpus/064_reject_modulo/meta.json new file mode 100644 index 0000000..0752e04 --- /dev/null +++ b/conformance/corpus/064_reject_modulo/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "% is M1, not a token"} diff --git a/conformance/corpus/064_reject_modulo/program.mpl b/conformance/corpus/064_reject_modulo/program.mpl new file mode 100644 index 0000000..a1c6840 --- /dev/null +++ b/conformance/corpus/064_reject_modulo/program.mpl @@ -0,0 +1 @@ +✎(5 % 2); diff --git a/conformance/corpus/065_reject_range/expected.err b/conformance/corpus/065_reject_range/expected.err new file mode 100644 index 0000000..7cb868b --- /dev/null +++ b/conformance/corpus/065_reject_range/expected.err @@ -0,0 +1 @@ +err_char diff --git a/conformance/corpus/065_reject_range/meta.json b/conformance/corpus/065_reject_range/meta.json new file mode 100644 index 0000000..24394f2 --- /dev/null +++ b/conformance/corpus/065_reject_range/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "range syntax [a..b] is M1"} diff --git a/conformance/corpus/065_reject_range/program.mpl b/conformance/corpus/065_reject_range/program.mpl new file mode 100644 index 0000000..0e82c2d --- /dev/null +++ b/conformance/corpus/065_reject_range/program.mpl @@ -0,0 +1 @@ +✎ [1..5]; diff --git a/conformance/corpus/066_reject_not_token/expected.err b/conformance/corpus/066_reject_not_token/expected.err new file mode 100644 index 0000000..7cb868b --- /dev/null +++ b/conformance/corpus/066_reject_not_token/expected.err @@ -0,0 +1 @@ +err_char diff --git a/conformance/corpus/066_reject_not_token/meta.json b/conformance/corpus/066_reject_not_token/meta.json new file mode 100644 index 0000000..0e12fa7 --- /dev/null +++ b/conformance/corpus/066_reject_not_token/meta.json @@ -0,0 +1 @@ +{"status": "unratified", "source": "coverage", "decision": "", "notes": "¬ is M1, not a token"} diff --git a/conformance/corpus/066_reject_not_token/program.mpl b/conformance/corpus/066_reject_not_token/program.mpl new file mode 100644 index 0000000..94e0b71 --- /dev/null +++ b/conformance/corpus/066_reject_not_token/program.mpl @@ -0,0 +1 @@ +✎(¬true);