zoukankan      html  css  js  c++  java
  • 递归——CPS(三)

    JScript不是天然支持CPS,但是可以写一个分发引擎使得能工作在CPS风格下。一般只有一个活动的continuation,所以可以定义规则:JScript CPS 函数允许有返回,但是它们做的最后一件事必须是将continuation告诉我们的分发引擎。

    为了让事情简单化,我们令每个CPS 风格的函数拥有一个参数,当然,可以是一个包含多个字段的对象。

    让我们回顾一下前面的 CPS treeDepth程序,并且将所有的 continuation 调用 替换为 这样一种调用: 这种调用告诉运行时引擎下一步 continuation 该做什么。然后,函数可以正常返回,并且让运行时引擎调用continuation。

    function treeDepth(args)
    {
        if(args.curtree == null)
            cont(args.afterDepth, 0);
        else
        {
            function afterLeft(leftDepth)
            {
                function afterRight(rightDepth)
                {
                    cont(args.afterDepth, 1+Math.max(leftDepth, rightDepth));
                }
                cont(treeDepth, {curtree: args.curtree.right, afterDepth: afterRight});
            }
            cont(treeDepth, {curtree: args.curtree.left, afterDepth: afterLeft});
        }
    }

    分发引擎为

    var continuation = null;
    function cont(newfunc, newargs)
    {
        continuation = {func: newfunc, args : newargs};
    }
    
    function run()
    {
        while(continuation != null)
        {
            var curfunc = continuation.func;
            var curargs = continuation.args;
            continuation = null;
            curfunc(curargs);
        }
    }

    如果下一步没有需要调用的话,就表示程序完成。为了确定一棵树的深度,我们简单地告诉continuation引擎下一步需要做什么。

    cont(treeDepth, {curtree: mytree, afterDepth: print });
    run();

     原文:https://blogs.msdn.microsoft.com/ericlippert/2005/08/15/recursion-part-six-making-cps-work/

  • 相关阅读:
    1.2 流程控制
    SpringMVC-第一个MVC程序的搭建需要
    用户与权限
    自定义函数和存储过程
    触发器
    事务
    约束
    视图和索引
    函数二
    函数一
  • 原文地址:https://www.cnblogs.com/sjjsxl/p/5634602.html
Copyright © 2011-2022 走看看