64 lines
1.3 KiB
Plaintext
64 lines
1.3 KiB
Plaintext
(import "stdlib.phi" (indent map map_has map_get map_set))
|
|
|
|
(fn Syms () (do
|
|
(let syms (list null (map)))
|
|
|
|
(fn enter_scope () (do
|
|
(= syms (list syms (map)))
|
|
))
|
|
|
|
(fn leave_scope () (do
|
|
(let (parent _) syms)
|
|
(= syms parent)
|
|
))
|
|
|
|
(fn define_sym (ident sym) (do
|
|
(let (_ map) syms)
|
|
(map_set map ident sym)
|
|
))
|
|
|
|
(fn find_sym (syms ident) (do
|
|
(let (parent map) syms)
|
|
(if (map_has map ident) (do
|
|
(return (map_get map ident))
|
|
))
|
|
(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
|
|
))
|
|
))
|
|
|