(import "stdlib.phi" (indent)) (fn Syms () (do (let syms (list null (list))) (fn enter_scope () (do (= syms (list syms (list))) )) (fn leave_scope () (do (let (parent _) syms) (= syms parent) )) (fn define_sym (ident sym) (do (let (_ map) syms) (let i 0) (loop (do (if (>= i (len map)) (break)) (let (s_ident _) (at map i)) (if (== ident s_ident) (do (set map i (list ident sym)) (return) )) (+= i 1) )) (push map (list ident sym)) )) (fn find_sym (syms ident) (do (let (parent map) syms) (let i 0) (loop (do (if (>= i (len map)) (break)) (let (s_ident s_sym) (at map i)) (if (== ident s_ident) (do (return s_sym) )) (+= i 1) )) (if (!= parent null) (do (return (find_sym parent ident)) )) (return null) )) (fn get_sym (ident) (do (return (find_sym syms ident)) )) (fn get_current_map () (do (let (_ map) syms) (return map) )) (fn print_syms_node (syms depth) (do (let (parent map) syms) (for (ident sym) map (do (println "%- %: %" (indent depth) ident sym) )) (if (!= parent null) (do (print_syms_node parent (+ depth 1)) )) )) (fn print_syms () (do (print_syms_node syms 0) )) (return (list enter_scope leave_scope define_sym get_sym get_current_map print_syms )) ))