Math Parser

Prefix notation might not be to your taste. Luckily writing a standard math parser is simple.

[letrec '[ math:[lambda '[eqn:1] '/[-expr eqn 0]/'v ] binary-fn:[lambda '[f:lhs g:rhs tok:token fn:f] '[lambda '[eqn:1 n:2] '[letrec '[ lhs:[f eqn n] rhs:[g eqn [+ ln 1]] ln:/lhs/'n rn:/rhs/'n lv:/lhs/'v rv:/rhs/'v ] '[if [= /eqn/ln tok] then:{n:rn v:[fn lv rv]} else:lhs ] ] ] ] unary-fn:[lambda '[g:rhs tok:token fn:f] '[binary-fn lhs:g rhs:g token:tok f:[lambda '[v:2] '[fn v]]] ] -expr:[binary-fn lhs:+expr rhs:-expr token:'- f:-] +expr:[binary-fn lhs:*expr rhs:+expr token:'+ f:+] *expr:[binary-fn lhs:div-expr rhs:*expr token:'* f:*] div-expr:[binary-fn lhs:pow-expr rhs:div-expr token:'/ f:/ ] pow-expr:[binary-fn lhs:sin-expr rhs:pow-expr token:'^ f: [lambda '[pow:0 a:1 b:2] '[if [= b 1] then:a else:[* a [pow a [- b 1]]] ] ] ] sin-expr:[unary-fn rhs:number token:'sin f:/Math/'sine] number:[lambda '[eqn:1 n:2] '[let '[tok:/eqn/n] '[if [number? tok] then:{n:[+ n 1] v:tok} else:[if [and [map? tok] [not [string? tok]]] then:{n:[+ n 1] v:[math tok]} else:{n:n v:0} "Token not recognised" ] ] ] ] ] '{ [math '[4 * 6 + 2]] [math '[-2 + 4 * 6]] [math '[2 ^ 8 + 200]] [math '[4 * [2 + 3]]] [let '[pi:3.14 r:10] '[math '[4 * ,pi * ,r ^ 2]]] [math '[sin 2 * 10]] } ]