def("{$from}s_to_{$to}s", function ($array) use($fn) { return array_map($fn, $array); }); }); // Объявить функцию $name, которая просто вернёт $value. def('def_return', function ($name, $value) { def($name, function () use($value) { return $value; }); }); def('def_text_inspector', function ($fn) { def_wrapper($fn, function ($call) use($fn) { echo ">> Calling '{$fn}' function with arguments:\n"; foreach ($call->args as $arg) { echo ">> - {$arg}\n"; } $r = $call(); echo ">> return value is '{$r}'\n"; return $r; }); }); def('def_antonyms', function ($true, $false, $fn) { def($true, $fn); def($false, function () use($fn) { $r = call_user_func_array($fn, func_get_args()); if ($r === true) { return false; } elseif ($r === false) { return true; } return $r;
<?php // При оборачивании функций с помощью def_wrapper - их можно всегда можно // развернуть обратно $wrapper = function ($call) { $call->args[0]++; echo ">"; $call(); }; def('say', function ($i) { echo $i . "\n"; }); say(1); def_wrapper('say', $wrapper); say(1); def_wrapper('say', $wrapper); say(1); undef_wrapper('say'); say(1); undef_wrapper('say'); say(1); ?> --- 1 >2 >>3 >2 1
<?php // Оборачивая функцию с помощью def_wrapper возможно переопределять // передаваемые аргументы def('m2', function ($i) { return $i * 2; }); def_wrapper('m2', function ($call) { return $call(3); }); echo m2(2); ?> --- 6
def('say', function ($what, $what2) { printf("ME>>: %s, %s\n", $what, $what2); }); say('one', 'two'); // ME>>: one, two def_wrapper('say', function ($call) { foreach ($call->args as $k => $v) { $call->args[$k] = strtoupper($v); } $call(); }); say('one', 'two'); // ME>>: ONE, TWO def_wrapper('say', function ($call) { foreach ($call->args as $k => $v) { $call->args[$k] = '_' . $v . '_'; } $call(); }); say('one', 'two'); // ME>>: _ONE_, _TWO_ undef_wrapper('say'); say('one', 'two'); // ME>>: ONE, TWO undef_wrapper('say'); say('one', 'two'); // ME>>: one, two undef_wrapper('say'); say('one', 'two'); //ME: one, two ////////////////////////////////////////////////// def_memo('sum', function ($one, $two) {