diff options
Diffstat (limited to 'src/expr2c.mac')
-rw-r--r-- | src/expr2c.mac | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/expr2c.mac b/src/expr2c.mac new file mode 100644 index 0000000..dba5987 --- /dev/null +++ b/src/expr2c.mac @@ -0,0 +1,20 @@ +printdecl(vars) := ( + sprint("double", first(vars)), + for v in rest(vars) do sprint(",", v), + sprint(";"))$ + +printdef(expr) := sprint(first(expr), "=", second(expr), ";")$ + +block2c(expr) := + if ?equal(op(expr), block) then ( + printdecl(first(expr)), + for d in reverse(rest(reverse(rest(expr)))) do printdef(d), + sprint("return", string(last(expr)), ";}", " +")) + else + sprint("return", string(expr), ";}", " +")$ + +expr2c(funcname, args, expr) := ( + sprint("double", funcname, "(", args, ") {"), + block2c(subst(pow, "^", optimize(expr))))$ |