1 // use jtc's introspection abilities to calculate symbolic derivatives
2 // of simple functions.
4 derive_expr = func(expr, var)
6 expansion = expand_node(expr)
7 if(size(expansion) == 1)
9 if(type(expansion[0]) == "string")
11 if(expansion[0] == var)
22 return derive(expansion[0], var)
25 else if(expansion[0] == "(")
27 return derive_expr(expansion[1], var)
31 dleft = derive_expr(expansion[0], var)
32 dright = derive_expr(expansion[2], var)
33 left = tostring(expansion[0])
34 right = tostring(expansion[2])
35 if(expansion[1] == "+")
37 return "(" + dleft + "+" + dright + ")"
39 else if(expansion[1] == "-")
41 return "(" + dleft + "-" + dright + ")"
43 else if(expansion[1] == "*")
45 return "(" + left + "*" + dright + "+" + dleft + "*" + right + ")"
47 else if(expansion[1] == "/")
49 return "(" + dleft + "*" + right + "-" + dright + "*" + left + ")/(" + right + "*" + right + ")"
54 derive = func(fun, var)
56 expansion = expand_node(fun)
57 vars = tostring(expansion[1])
60 var = tostring(expand_node(expansion[1])[1])
62 expr = expand_node(expansion[2])[1]
63 source = "func"+vars+" return "+derive_expr(expr, var)+""
64 return eval(parse_expression(source))
67 f = func(x) return x*x
70 g = func(x, y) return x*y
73 print(tostring(df) "\n")
74 print(tostring(dg) "\n")