summaryrefslogtreecommitdiff
path: root/src/expr2c.mac
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2006-12-18 17:35:10 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2006-12-18 17:35:10 +0100
commit654ba2975793608dfa5588bddca775d24779f17c (patch)
tree40365569feb4acb00885313389fbda13b3cfa2fd /src/expr2c.mac
parentc7286f257ec637f2d67e4b4a2bd1d70b4aff0116 (diff)
400% speedup by using maxima's optimize()
Diffstat (limited to 'src/expr2c.mac')
-rw-r--r--src/expr2c.mac20
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))))$