mirror of
https://github.com/kanaka/mal.git
synced 2024-08-17 17:50:24 +03:00
167 lines
4.9 KiB
JSON
167 lines
4.9 KiB
JSON
["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
|
|
]
|