}
}
+ 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
"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,
"map" => do_map,
"conj" => conj,
+ "seq" => seq,
"meta" => meta,
"with-meta" => with_meta,