예제 #1
0
파일: index.php 프로젝트: blackwood/phlp
function phlp($expression)
{
    $special = Native::special();
    $reducers = Native::reducers();
    $funcs = Native::funcs();
    $fn = null;
    // only to check if first value IS a known function.
    $accepted = array_merge($special, $reducers, $funcs, Native::getdef());
    if (is_string($expression[0]) && (function_exists($expression[0]) || array_key_exists($expression[0], $accepted) || array_key_exists($expression[0], Native::getdef()))) {
        $fn = $expression[0];
    }
    if (array_key_exists($fn, $special)) {
        return call_user_func_array($special[$fn], array_slice($expression, 1));
    }
    if ($fn === 'def') {
        return call_user_func_array($fn, array_slice($expression, 1));
    }
    is_array($expression) && ($args = array_map(function ($arg) use($fn, $reducers) {
        if (is_array($arg)) {
            return phlp($arg);
        } elseif (is_string($arg) && array_key_exists($arg, Native::getdef()) && ($dfs = Native::getdef())) {
            return $dfs[$arg];
        } else {
            return $arg;
        }
    }, array_slice($expression, count($fn))));
    if (array_key_exists($fn, $reducers)) {
        return array_reduce($args, $reducers[$fn]);
    } elseif (array_key_exists($fn, Native::getdef()) && ($dfs = Native::getdef())) {
        return call_user_func_array($dfs[$fn], $args);
    } elseif (array_key_exists($fn, $funcs)) {
        return call_user_func_array($funcs[$fn], $args);
    } elseif ($fn && func_args_are_arrays($args)) {
        return call_user_func_array($fn, $args);
    } elseif ($signature = has_known_signature_type($fn)) {
        return call_user_func("call_user_func{$signature}", $fn, $args);
    } elseif ($fn) {
        return array_map(function ($arg) use($fn) {
            return call_user_func($fn, $arg);
        }, $args);
    } else {
        return $args;
    }
}