function _equal_Q($a, $b) { $ota = gettype($a) === "object" ? get_class($a) : gettype($a); $otb = gettype($b) === "object" ? get_class($b) : gettype($b); if (!($ota === $otb or _sequential_Q($a) and _sequential_Q($b))) { return false; } elseif (_symbol_Q($a)) { #print "ota: $ota, otb: $otb\n"; return $a->value === $b->value; } elseif (_list_Q($a) or _vector_Q($a)) { if ($a->count() !== $b->count()) { return false; } for ($i = 0; $i < $a->count(); $i++) { if (!_equal_Q($a[$i], $b[$i])) { return false; } } return true; } elseif (_hash_map_Q($a)) { if ($a->count() !== $b->count()) { return false; } $hm1 = $a->getArrayCopy(); $hm2 = $b->getArrayCopy(); foreach (array_keys($hm1) as $k) { if ($hm1[$k] !== $hm2[$k]) { return false; } } return true; } else { return $a === $b; } }
function _equal_Q($a, $b) { $ota = gettype($a) === "object" ? get_class($a) : gettype($a); $otb = gettype($b) === "object" ? get_class($b) : gettype($b); if (!($ota === $otb or _sequential_Q($a) and _sequential_Q($b))) { return false; } elseif (_symbol_Q($a)) { #print "ota: $ota, otb: $otb\n"; return $a->value === $b->value; } elseif (_list_Q($a) or _vector_Q($a)) { if ($a->count() !== $b->count()) { return false; } for ($i = 0; $i < $a->count(); $i++) { if (!_equal_Q($a[$i], $b[$i])) { return false; } } return true; } else { return $a === $b; } }
return $atm->value; } function reset_BANG($atm, $val) { return $atm->value = $val; } function swap_BANG($atm, $f) { $args = array_slice(func_get_args(), 2); array_unshift($args, $atm->value); $atm->value = call_user_func_array($f, $args); return $atm->value; } // core_ns is namespace of type functions $core_ns = array('=' => function ($a, $b) { return _equal_Q($a, $b); }, 'throw' => function ($a) { return mal_throw($a); }, 'nil?' => function ($a) { return _nil_Q($a); }, 'true?' => function ($a) { return _true_Q($a); }, 'false?' => function ($a) { return _false_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) {