implement Execlib; include "sys.m"; sys: Sys; include "draw.m"; Execlib: module { init: fn(ctxt: ref Draw->Context, args: list of string); hailstone: fn(i: big): list of big; }; init(nil: ref Draw->Context, nil: list of string) { sys = load Sys Sys->PATH; seq := hailstone(big 27); l := len seq; sys->print("hailstone(27): "); for(i := 0; i < 4; i++) { sys->print("%bd, ", hd seq); seq = tl seq; } sys->print("⋯"); while(len seq > 4) seq = tl seq; while(seq != nil) { sys->print(", %bd", hd seq); seq = tl seq; } sys->print(" (length %d)\n", l); max := 1; maxn := big 1; for(n := big 2; n < big 100000; n++) { cur := len hailstone(n); if(cur > max) { max = cur; maxn = n; } } sys->print("hailstone(%bd) has length %d\n", maxn, max); } hailstone(i: big): list of big { if(i == big 1) return big 1 :: nil; if(i % big 2 == big 0) return i :: hailstone(i / big 2); return i :: hailstone(big 3 * i + big 1); }