Есть ли у этой (батутоподобной) конструкции имя?

Я хотел избежать разрыва стека при создании системы, аналогичной функциональный совет или же комбинация методов. Это включает в себя обход дерева (в моей реализации), условную рекурсию и т. Д. Одним из очень немногих методов, доступных для преобразования рекурсии в циклы, является прыжок на батуте. Я попробовал это, а затем обнаружил, что мне нужно реализовать, например. оценка логического выражения при коротком замыкании. Короче говоря, я реализовал комбинацию батута с продолжениями, и теперь я пытаюсь выяснить, существует ли эта конструкция и как ее можно назвать — поскольку я не смог найти ни одной такой уже существующей конструкции.

Моя реализация — оценка отказов с ручной обработкой стека:

function immediate($bounce, $args)
{
$stack = array($bounce->run($args));

while ($stack[0] instanceof Bounce) {
$current = array_pop($stack);
if ($current instanceof Bounce) {
$stack[] = $current;
$stack[] = $current->current();
} else {
$next = array_pop($stack);
$stack[] = $next->next($current);
}
}

return $stack[0];
}

Класс отказов:

class Bounce
{
protected $current;
protected $next;

public function __construct($current, $next)
{
$this->current = $current;
$this->next = $next;
}

public function current()
{
$fn = $this->current;
return $fn();
}

public function next($arg)
{
$fn = $this->next;
return $fn($arg);
}
}

И, как пример, реализация короткого замыкания И (т.е. в JavaScript first(args) && second(args)). $first а также $second являются функциями, которые могут возвращать Bounceтакже.

return new Bounce(
function () use ($first, $args) {
return $first($args);
},
function ($return) use ($second, $args) {
if (!$return) {
return $return;
}
return new Bounce(
function () use ($second, $args) {
return $second($args);
},
null
);
}
);

Это учитывает общую рекурсию, с накладными расходами приблизительно 3 вызова функции на нормальный вызов функции (хотя в общем случае для переменного числа итераций писать довольно громоздко и требует ‘ленивой рекурсии’).

Кто-нибудь видел такую ​​структуру раньше?

5

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]