["do", ["`", "Utility Functions"], ["def", "_cmp_seqs", ["fn", ["a", "b"], ["if", ["not", ["=", ["count", "a"], ["count", "b"]]], false, ["if", ["empty?", "a"], true, ["if", ["equal?", ["get", "a", 0], ["get", "b", 0]], ["_cmp_seqs", ["rest", "a"], ["rest", "b"]], false]]]]], ["def", "_check_hash_map_keys", ["fn", ["ks", "a", "b"], ["if", ["empty?", "ks"], true, ["let", ["k", ["first", "ks"]], ["if", ["equal?", ["get", "a", "k"], ["get", "b", "k"]], ["_check_hash_map_keys", ["rest", "ks"], "a", "b"], false]]]]], ["def", "_cmp_hash_maps", ["fn", ["a", "b"], ["let", ["aks", ["keys", "a"]], ["if", ["not", ["=", ["count", "aks"], ["count", ["keys", "b"]]]], false, ["_check_hash_map_keys", "aks", "a", "b"]]]]], ["def", "equal?", ["fn", ["a", "b"], ["if", ["sequential?", "a"], ["if", ["sequential?", "b"], ["_cmp_seqs", "a", "b"], false], ["if", ["map?", "a"], ["if", ["map?", "b"], ["_cmp_hash_maps", "a", "b"], false], ["if", ["symbol?", "a"], ["if", ["symbol?", "b"], ["=", ["get", "a", ["`", "val"]], ["get", "b", ["`", "val"]]], false], ["=", "a", "b"]]]]]], ["def", "_clone", ["fn", ["obj"], ["if", ["list?", "obj"], ["slice", "obj", 0], ["if", ["vector?", "obj"], ["let", ["new-obj", ["slice", "obj", 0]], ["do", ["set", "new-obj", ["`", "__vector?__"], true], "new-obj"]], ["if", ["map?", "obj"], ["let", ["new-obj", ["hash-map"]], ["do", ["map", ["fn", ["k"], ["if", [".", "obj", ["`", "hasOwnProperty"], "k"], ["set", "new-obj", "k", ["get", "obj", "k"]], null]], ["keys", "obj"]], "new-obj"]], ["if", ["malfunc?", "obj"], ["let", ["new-obj", ["malfunc", ["get", "obj", ["`", "fn"]], ["get", "obj", ["`", "ast"]], ["get", "obj", ["`", "env"]], ["get", "obj", ["`", "params"]]]], ["do", ["set", "new-obj", ["`", "macro?"], ["get", "obj", ["`", "macro?"]]], ["set", "new-obj", ["`", "__meta__"], ["get", "obj", ["`", "__meta__"]]], "new-obj"]], ["throw", "clone of unsupported type"]]]]]]], ["def", "clone", ["fn", ["obj"], ["let", ["new-obj", ["_clone", "obj"]], ["do", [".", "Object", ["`", "defineProperty"], "new-obj", ["`", "__meta__"], {"enumerable": false, "writable": true}], "new-obj"]]]], ["def", "assoc!", ["fn", ["a", "b", "c"], ["do", ["set", "a", "b", "c"], "a"]]], ["def", "assocs!", ["fn", ["hm", "kvs"], ["if", ["empty?", "kvs"], "hm", ["do", ["assoc!", "hm", ["get", "kvs", 0], ["get", "kvs", 1]], ["assocs!", "hm", ["slice", "kvs", 2]]]]]], ["def", "Symbol", ["fn", [], null]], ["def", "symbol", ["fn", ["name"], ["assoc!", ["new", "Symbol"], ["`", "val"], "name"]]], ["def", "symbol?", ["fn", ["a"], ["isa", "a", "Symbol"]]], ["def", "keyword", ["fn", ["name"], ["if", ["keyword?", "name"], "name", ["str", ["`", "\u029e"], "name"]]]], ["def", "keyword?", ["fn", ["kw"], ["and", ["=", ["`", "[object String]"], ["classOf", "kw"]], ["=", ["`", "\u029e"], ["get", "kw", 0]]]]], ["`", "Override some list defs to account for Vectors"], ["def", "sequential?", ["fn", ["a"], [".", "Array", ["`", "isArray"], "a"]]], ["def", "list?", ["fn", ["a"], ["if", [".", "Array", ["`", "isArray"], "a"], ["if", [".-", "a", ["`", "__vector?__"]], false, true], false]]], ["def", "empty?", ["fn", ["a"], ["if", ["sequential?", "a"], ["if", ["=", 0, [".-", "a", ["`", "length"]]], true, false], ["=", "a", null]]]], ["def", "vectorl", ["fn", ["lst"], ["let", ["vec", ["slice", "lst", 0]], ["do", ["set", "vec", ["`", "__vector?__"], true], "vec"]]]], ["def", "vector", ["fn", ["&", "args"], ["vectorl", "args"]]], ["def", "vector?", ["fn", ["a"], ["if", [".", "Array", ["`", "isArray"], "a"], ["if", [".-", "a", ["`", "__vector?__"]], true, false], false]]], ["def", "HashMap", ["fn", [], null]], ["def", "hash-map", ["fn", ["&", "a"], ["assocs!", ["new", "HashMap"], "a"]]], ["def", "map?", ["fn", ["a"], ["isa", "a", "HashMap"]]], ["def", "MalFunc", ["fn", [], null]], ["def", "malfunc", ["fn", ["fn", "ast", "env", "params"], ["assocs!", ["new", "MalFunc"], ["list", ["`", "fn"], "fn", ["`", "ast"], "ast", ["`", "env"], "env", ["`", "params"], "params", ["`", "macro?"], false]]]], ["def", "malfunc?", ["fn", ["a"], ["isa", "a", "MalFunc"]]], ["def", "Atom", ["fn", [], null]], ["def", "atom", ["fn", ["a"], ["let", ["atm", ["new", "Atom"]], ["do", ["set", "atm", ["`", "val"], "a"], "atm"]]]], ["def", "atom?", ["fn", ["a"], ["isa", "a", "Atom"]]], null ]