how to traverse a parse tree (list) do_atom(a) switch typeof(a) NUM: GLOBAL: LOCAL: go(e) if e == nil stop if isatom(e) do_atom(e) // then e is a list (operator operand*) a = first(e) b = tail(e) switch typeof(a) PLUS: go(first(b)) + go(second(b)) MINUS: ... how to create a parse tree example: copy a tree copy(a) if isatom(a) return newatom(copyof(a)) else return cons(copy(first(a)), copy(tail(a)) )