@(next :args) @(define space)@/ */@(end) @(define mulop (nod))@\ @(local op)@\ @(space)@\ @(cases)@\ @{op /[*]/}@(bind nod @(intern op *user-package*))@\ @(or)@\ @{op /\//}@(bind (nod) @(list 'trunc))@\ @(end)@\ @(space)@\ @(end) @(define addop (nod))@\ @(local op)@(space)@{op /[+\-]/}@(space)@\ @(bind nod @(intern op *user-package*))@\ @(end) @(define number (nod))@\ @(local n)@(space)@{n /[0-9]+/}@(space)@\ @(bind nod @(int-str n 10))@\ @(end) @(define factor (nod))@(cases)(@(expr nod))@(or)@(number nod)@(end)@(end) @(define term (nod))@\ @(local op nod1 nod2)@\ @(cases)@\ @(factor nod1)@\ @(cases)@(mulop op)@(term nod2)@(bind nod (op nod1 nod2))@\ @(or)@(bind nod nod1)@\ @(end)@\ @(or)@\ @(addop op)@(factor nod1)@\ @(bind nod (op nod1))@\ @(end)@\ @(end) @(define expr (nod))@\ @(local op nod1 nod2)@\ @(term nod1)@\ @(cases)@(addop op)@(expr nod2)@(bind nod (op nod1 nod2))@\ @(or)@(bind nod nod1)@\ @(end)@\ @(end) @(cases) @ {source (expr e)} @ (output) source: @source AST: @(format nil "~s" e) value: @(eval e nil) @ (end) @(or) @ (maybe)@(expr e)@(end)@bad @ (output) erroneous suffix "@bad" @ (end) @(end)