8

在创建类似于函数建议方法组合的系统时,我想避免破坏堆栈。这涉及树遍历(在我的实现中)、条件递归等。可用于将递归转换为循环的极少数方法之一是蹦床。我已经尝试过了,然后发现我需要实现例如。短路布尔表达式求值。简而言之,我已经实现了蹦床与延续的组合,现在我试图找出这种结构是否存在以及它的名称可能是什么——因为我无法找到任何这样的已经存在的结构。

我的实现 - 带有手动堆栈处理的反弹评估:

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

并且,例如,短路 AND 实现(即在 JavaScript 中first(args) && second(args))。$first并且$second是也可能返回Bounces 的函数。

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 个函数调用的开销(尽管在变量迭代计数的一般情况下,编写起来非常麻烦并且需要“惰性递归”)。

有没有人见过这样的结构?

4

0 回答 0