9545257333
Milestone-close fieldtest for the raw-buf milestone, milestone-scope
variant: four end-to-end scenarios derived top-down from the milestone
promise (construct via (new RawBuf <elem> <size>), fill/read via
set/get, size-only buffers, element variety across {Int,Float,Bool},
forbidden-element reject at check, buffer threading under own/borrow).
Result confirms the milestone-promise hypothesis — RawBuf is clean
end to end, zero bugs:
- mrb_1 Int fill/read loop: check ok, run + native build both print 70
- mrb_2 Float own->own threading + borrow read: prints 3.5
- mrb_3 size-only Bool buffer (#51 legitimate-but-unobserved case): prints 8
- mrb_4 Unit element: rejected at check with a precise
param-not-in-restricted-set diagnostic; build stops at the same
error, codegen never reached (the #51 fix)
Two [working] findings (carry-on) and one [spec_gap]: the
kernel-extensions whitepaper (design/models/0007) teaches bare-mode
fn-type slots that the post-#55 parser rejects. Verified and triaged
separately; the ledger fix follows in its own commit.
30 lines
1.3 KiB
Plaintext
30 lines
1.3 KiB
Plaintext
(module mrb_1_histogram
|
|
(fn fill
|
|
(doc "Fill an Int RawBuf at indices i..n with the running value v, stepping v by 7 each slot. own->own threading: the buffer is consumed and returned per RawBuf.set, so the recursion re-binds buf each step.")
|
|
(type (fn-type
|
|
(params (own (con RawBuf (con Int))) (own (con Int)) (own (con Int)) (own (con Int)))
|
|
(ret (own (con RawBuf (con Int))))))
|
|
(params buf i n v)
|
|
(body
|
|
(if (app eq i n)
|
|
buf
|
|
(tail-app fill (app RawBuf.set buf i v) (app + i 1) n (app + v 7)))))
|
|
(fn sum
|
|
(doc "Read back indices i..n of a borrow-mode RawBuf and total them. Reader: receiver is borrowed, never consumed.")
|
|
(type (fn-type
|
|
(params (borrow (con RawBuf (con Int))) (own (con Int)) (own (con Int)) (own (con Int)))
|
|
(ret (own (con Int)))))
|
|
(params buf i n acc)
|
|
(body
|
|
(if (app eq i n)
|
|
acc
|
|
(tail-app sum buf (app + i 1) n (app + acc (app RawBuf.get buf i))))))
|
|
(fn main
|
|
(doc "Allocate a 5-slot Int RawBuf, fill it (0,7,14,21,28), then sum it back and print 70.")
|
|
(type (fn-type (params) (ret (own (con Unit))) (effects IO)))
|
|
(params)
|
|
(body
|
|
(let buf (new RawBuf (con Int) 5)
|
|
(let buf (app fill buf 0 5 0)
|
|
(app print (app sum buf 0 5 0)))))))
|