"nil?" none?
"true?" (fn [a] (and (instance? bool a) (= a True)))
"false?" (fn [a] (and (instance? bool a) (= a False)))
+ "number?" (fn [a] (instance? int a))
"string?" (fn [a] (and (string? a) (not (keyword? a))))
"symbol" (fn [a] (Sym a))
"symbol?" (fn [a] (instance? Sym a))
"keyword" (fn [a] (Keyword (if (keyword? a) a (+ ":" a))))
"keyword?" (fn [a] (keyword? a))
+ "fn?" (fn [a] (and (callable a) (or (not (hasattr a "macro"))
+ (not a.macro))))
+ "macro?" (fn [a] (and (callable a) (and (hasattr a "macro") a.macro)))
"pr-str" (fn [&rest a] (Str (.join " " (map (fn [e] (pr-str e True)) a))))
"str" (fn [&rest a] (Str (.join "" (map (fn [e] (pr-str e False)) a))))
'nil?'=> function ($a) { return _nil_Q($a); },
'true?'=> function ($a) { return _true_Q($a); },
'false?'=> function ($a) { return _false_Q($a); },
+ 'number?'=> function ($a) { return _number_Q($a); },
'symbol'=> function () { return call_user_func_array('_symbol', func_get_args()); },
'symbol?'=> function ($a) { return _symbol_Q($a); },
'keyword'=> function () { return call_user_func_array('_keyword', func_get_args()); },
'keyword?'=> function ($a) { return _keyword_Q($a); },
'string?'=> function ($a) { return _string_Q($a); },
+ 'fn?'=> function($a) { return _fn_Q($a) || (_function_Q($a) && !$a->ismacro ); },
+ 'macro?'=> function($a) { return _function_Q($a) && $a->ismacro; },
'pr-str'=> function () { return call_user_func_array('pr_str', func_get_args()); },
'str'=> function () { return call_user_func_array('str', func_get_args()); },
'prn'=> function () { return call_user_func_array('prn', func_get_args()); },
function _string_Q($obj) {
return is_string($obj) && strpos($obj, chr(0x7f)) !== 0;
}
+function _number_Q($obj) { return is_int($obj); }
// Symbols
return new FunctionClass($func, $type, $ast, $env, $params, $ismacro);
}
function _function_Q($obj) { return $obj instanceof FunctionClass; }
+function _fn_Q($obj) { return $obj instanceof Closure; }
// Parent class of list, vector, hash-map
"nil?" = { param($a); $a -eq $null };
"true?" = { param($a); $a -eq $true };
"false?" = { param($a); $a -eq $false };
+ "number?" = { param($a); $a -is [int32] };
"string?" = { param($a); string? $a };
"symbol" = Get-Command new-symbol;
"symbol?" = { param($a); symbol? $a };
"keyword" = Get-Command new-keyword;
"keyword?" = { param($a); keyword? $a };
+ "fn?" = { param($a); (fn? $a) -or ((malfunc? $a) -and
+ (-not $a.macro)) };
+ "macro?" = { param($a); (malfunc? $a) -and $a.macro };
"pr-str" = { pr_seq $args $true " " };
"str" = { pr_seq $args $false "" };
function malfunc?($obj) {
$obj -is [MalFunc]
}
+
+function fn?($obj) {
+ $obj -is [System.Management.Automation.ScriptBlock]
+}
#
# General functions
#
}
}
+ def fn_Q(a: List[Any]) = {
+ a(0) match {
+ case s: Func => true
+ case s: MalFunction => !s.asInstanceOf[MalFunction].ismacro
+ case _ => false
+ }
+ }
+
+ def macro_Q(a: List[Any]) = {
+ a(0) match {
+ case s: MalFunction => s.asInstanceOf[MalFunction].ismacro
+ case _ => false
+ }
+ }
+
// number functions
def _bool_op(a: List[Any], op: (Long, Long) => Boolean) = {
op(a(0).asInstanceOf[Long],a(1).asInstanceOf[Long])
op(a(0).asInstanceOf[Long],a(1).asInstanceOf[Long])
}
+ def number_Q(a: List[Any]) = {
+ a(0).isInstanceOf[Long] || a(0).isInstanceOf[Double]
+ }
+
// string functions
def read_string(a: List[Any]) = {
"nil?" -> ((a: List[Any]) => a(0) == null),
"true?" -> ((a: List[Any]) => a(0) == true),
"false?" -> ((a: List[Any]) => a(0) == false),
+ "number?" -> number_Q _,
"string?" -> string_Q _,
"symbol" -> ((a: List[Any]) => Symbol(a(0).asInstanceOf[String])),
"symbol?" -> ((a: List[Any]) => a(0).isInstanceOf[Symbol]),
"keyword" -> keyword _,
"keyword?" -> keyword_Q _,
+ "fn?" -> fn_Q,
+ "macro?" -> macro_Q,
"pr-str" -> ((a: List[Any]) => _pr_list(a, true, " ")),
"str" -> ((a: List[Any]) => _pr_list(a, false, "")),