Ejemplo n.º 1
0
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;
    }
}
Ejemplo n.º 2
0
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;
    }
}
Ejemplo n.º 3
0
Archivo: core.php Proyecto: mdkarch/mal
    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) {