50b68267fe
Closes the 19a/19a.1/19b arc. Corpus signal from 19a.1 (5/65
fixtures fire over-strict-mode, all deliberate RC codegen-test
fixtures) justified shipping the suppress mechanism end-to-end.
Schema: Suppress { code, because } on FnDef. Pre-19b hashes
bit-identical via skip_serializing_if. Typechecker drops matching
diagnostics; empty 'because' is Error severity; wrong codes are
silent no-ops (open-set registry).
Form-A: (suppress (code "...") (because "...")) clause, parser
+ printer round-trip clean. Form-B: '// @suppress <code>: <reason>'
above the doc string, lossless contract metadata.
5 RC fixtures migrated (.ail.json + .ailx + .prose.txt). Corpus
signal: 5/65 -> 0/65. Lint still fires on any future fn that's
accidentally over-strict without an authored reason.
Test counts: ailang-check 55->61, ailang-core 26->28, ailang-surface
21->26, ailang-prose 49->52, e2e 70 unchanged.
Known debt: .ailx comment headers lost on regen (ail render's
contract excludes comments); parse_suppress_attr accepts
duplicate code/because attrs without diagnose (bounded by canonical
print order).
28 lines
1.4 KiB
Plaintext
28 lines
1.4 KiB
Plaintext
(module rc_drop_iterative_long_list
|
|
(data IntList
|
|
(ctor INil)
|
|
(ctor ICons (con Int) (con IntList))
|
|
(drop-iterative))
|
|
(fn cons_n_acc
|
|
(doc "Tail-recursive list builder. acc-prepended.")
|
|
(type (fn-type (params (con Int) (con IntList)) (ret (con IntList))))
|
|
(params n acc)
|
|
(body (if (app == n 0) acc (tail-app cons_n_acc (app - n 1) (term-ctor IntList ICons n acc)))))
|
|
(fn cons_n
|
|
(doc "Build [1, 2, ..., n] :: IntList. Order is reverse of build but immaterial for head/sum.")
|
|
(type (fn-type (params (con Int)) (ret (con IntList))))
|
|
(params n)
|
|
(body (app cons_n_acc n (term-ctor IntList INil))))
|
|
(fn head_or_zero
|
|
(doc "Take ownership of an IntList; return its head if ICons, else 0. The (own ...) signature signals 18d.4 to emit an Own-param drop at fn return — which under the (drop-iterative) annotation is the iterative-worklist body, freeing the entire chain via the heap-allocated worklist instead of recursive cascade.")
|
|
(suppress (code "over-strict-mode") (because "Iter 18e test: forces (drop-iterative) cascade via Own-param drop at fn return"))
|
|
(type (fn-type (params (own (con IntList))) (ret (con Int))))
|
|
(params xs)
|
|
(body (match xs
|
|
(case (pat-ctor INil) 0)
|
|
(case (pat-ctor ICons h t) h))))
|
|
(fn main
|
|
(type (fn-type (params) (ret (con Unit)) (effects IO)))
|
|
(params)
|
|
(body (do io/print_int (app head_or_zero (app cons_n 1000000))))))
|