Merge pull request #378 from asarhaddon/test-macro-not-changing-function
[jackhill/mal.git] / haxe / core / Core.hx
index 8df917f..d7b82d3 100644 (file)
@@ -197,6 +197,21 @@ class Core {
         }
     }
 
+    static function seq(args) {
+        return switch (args[0]) {
+            case MalList(l):
+                l.length > 0 ? args[0] : nil;
+            case MalVector(l):
+                l.length > 0 ? MalList(l.slice(0)) : nil;
+            case MalString(s):
+                if (s.length == 0) { return nil; }
+                MalList(s.split("").map(function(c) { return MalString(c); }));
+            case MalNil:
+                nil;
+            case _: throw "seq: called on non-sequence";
+        }
+    }
+
 
     // hash-map functions
 
@@ -308,10 +323,14 @@ class Core {
         "nil?" => function(a) { return BoolFn(nil_Q(a[0])); },
         "true?" => function(a) { return BoolFn(true_Q(a[0])); },
         "false?" => function(a) { return BoolFn(false_Q(a[0])); },
+        "string?" => function(a) { return BoolFn(string_Q(a[0])); },
         "symbol" => symbol,
         "symbol?" => function(a) { return BoolFn(symbol_Q(a[0])); },
         "keyword" => keyword,
         "keyword?" => function(a) { return BoolFn(keyword_Q(a[0])); },
+        "number?" => function(a) { return BoolFn(number_Q(a[0])); },
+        "fn?" => function(a) { return BoolFn(_fn_Q(a[0])); },
+        "macro?" => function(a) { return BoolFn(_macro_Q(a[0])); },
 
         "pr-str" => pr_str,
         "str" => str,
@@ -349,13 +368,14 @@ class Core {
         "concat" => do_concat,
         "nth" => nth,
         "first" => function(a) { return first(a[0]); },
-        "rest" => function(a) { return MalList(_list(a[0]).slice(1)); },
+        "rest" => function(a) { return rest(a[0]); },
         "empty?" => empty_Q,
         "count" => count,
         "apply" => apply,
         "map" => do_map,
 
         "conj" => conj,
+        "seq" => seq,
 
         "meta" => meta,
         "with-meta" => with_meta,