Пример #1
0
    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
Пример #4
0
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) {