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; } }