ref: 961b64f18bcd6f6280a79638fd0634ff915cc4aa
dir: /test/stdbigint.myr/
use std type cmd = union `Add (cmd#, cmd#) `Sub (cmd#, cmd#) `Mul (cmd#, cmd#) `Div (cmd#, cmd#) `Mod (cmd#, cmd#) `Shl (cmd#, cmd#) `Shr (cmd#, cmd#) `Modpow (cmd#, cmd#, cmd#) `Val byte[:] `Res cmd# ;; const main = { var a, b, c, d, e var buf : byte[4096], n a = std.mkbigint(1234) b = std.mkbigint(0x7fffffff) c = std.mkbigint(7919) d = std.mkbigint(113051) e = std.mkbigint(11) std.bigmul(a, b) std.bigmul(a, b) std.bigadd(a, c) std.bigsub(a, d) std.bigdiv(a, e) std.bigfree(b) std.bigfree(c) std.bigfree(d) std.bigfree(e) n = std.bigbfmt(buf[:], a, 0) std.put("%s\n", buf[:n]) /* smoke test for division */ run(std.mk(`Res \ std.mk(`Div (\ std.mk(`Val "1234_5678_1234_6789_6666_7777_8888"), \ std.mk(`Val "1234_5678_1234_6789_6666_7777"))))) run(std.mk(`Res \ std.mk(`Div (\ std.mk(`Val "0xffff_1234_1234_1234_1234"), \ std.mk(`Val "0xf010_1234_2314"))))) run(std.mk(`Res \ std.mk(`Div (\ std.mk(`Val "5192296858534810493479828944327220"), \ std.mk(`Val "75557863709417659441940"))))) } const run = {e : cmd# var buf : byte[4096] var v, n match e# | `Add (x, y): -> binop("+", std.bigadd, x, y) | `Sub (x, y): -> binop("-", std.bigsub, x, y) | `Mul (x, y): -> binop("*", std.bigmul, x, y) | `Div (x, y): -> binop("/", std.bigdiv, x, y) | `Mod (x, y): -> binop("%", std.bigmod, x, y) | `Shl (x, y): -> binop("<<", std.bigshl, x, y) | `Shr (x, y): -> binop(">>", std.bigshr, x, y) | `Val x: v = try(std.bigparse(x)) n = std.bigbfmt(buf[:], v, 0) std.put("%s", buf[:n]) -> v | `Res r: v = run(r) n = std.bigbfmt(buf[:], v, 0) std.put(" == %s\n", buf[:n]) | `Modpow (x, y, m): n = std.bigbfmt(buf[:], std.bigmodpow(run(x), run(y), run(m)), 0) std.put("(%s ^ %s) % %s = %s\n", x, y, m, buf[:n]) ;; } const binop = {name, op, x, y var a, b a = run(x) std.put(" %s ", name) b = run(y) op(a, b) std.bigfree(b) -> a } generic try = {x : std.option(@a) match x | `std.Some v: -> v | `std.None: std.die("failed to get val") ;; }