parseWS xs -> all \Space xs parseNumber [@xs] -> if (all digit? xs) then asBase 10 xs parseSymbol [@xs] -> if (all alpha? xs) then asSymbol xs parseRest x -> x.{[] => 'nil; [@!WS] => 'nil [\Space @!WS e:!Sexp es:!Rest] => if es=='nil [e] [e@es]} parseList xs -> parseRest [\Space @xs] parseSexp x -> x.{[e:!Number]=>e; [e:!Symbol]=>e [\( @!WS es:!List \)] => e}