有没有同学来讲解下王垠的代码的... - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技问题时复制粘贴 AI 生成的内容
jiyinyiyong
V2EX    程序员

有没有同学来讲解下王垠的代码的...

  •  
  • /li>
  •   jiyinyiyong
    jiyinyiyong 2013-03-03 19:06:37 +08:00 23651 次点击
    这是一个创建于 4673 天前的主题,其中的信息可能已经有所发展或是发生改变。
    居然更新了三篇 http://blog.sina.com.cn/s/articlelist_1569777711_0_1.html
    中间说到一段:

    “”“
    我最精要的代码都放在 GitHub 上了。但是除非接受过专门的训练,你恐怕不会理解它们的价值。你会很难想象,这样一片普通人看起来像是玩具的 40 行代码,融入了我一个星期的日日夜夜的心血,数以几十计的推翻重写。这段代码,曾经耗费了一些顶尖专家十多年的研究。一个教授告诉我,光是想看懂他们的论文就需要不止一个月。而它却被我在一个星期之内闷头写出来了。我是在说大话吗?代码就摆在那里,自己去看看不就知道了。当我死后,如果有人想要知道什么是我上半生最重要的“杰作”,也就是这 40 行代码了。它蕴含的美,超越我给任何公司写的成千上万行的代码。
    ”“”

    然后链接给出了这段代码, 应该是没错的...

    https://github.com/yinwang0/gems/blob/master/cps.ss

    作为 CoffeeScript 死党表示对 Racket 真心不深入
    而且就算带着景仰, 代码理解上的藩篱也不是就能越过去的
    求掌握了 Racket 的同学讲解.. Orz
    16 条回复    1970-01-01 08:00:00 +08:00
    monkeydev
        1
    monkeydev  
       2013-03-03 19:14:38 +08:00
    同观摩中
    monkeydev
        2
    monkeydev  
       2013-03-03 19:16:39 +08:00
    @jiyinyiyong 你blog怎么挂了啊
    jiyinyiyong
        3
    jiyinyiyong  
    OP
       2013-03-03 19:30:19 +08:00
    @monkeydev 我的博客 VPS 太慢所以没去打理了.. 现在先改了微博网址
    monkeydev
        4
    monkeydev  
       2013-03-03 19:31:58 +08:00
    @jiyinyiyong 哦,我订阅你的blog,今天点开不能访问
    monkeydev
        5
    monkeydev  
       2013-03-03 19:33:41 +08:00
    @jiyinyiyong 如果你的blog是PHP的话,可以free一个虚拟主机给你
    qiao
        6
    qiao  
       2013-03-03 19:34:42 +08:00   2
    就是一段代等的 Continuation Passing Style。西不好解,推去看本: Essentials of Programming Languages (搞 scheme 的都本的作者, Daniel P Friedman,人也是王在 Indiana 大的)
    limu
        7
    limu  
       2013-03-03 19:34:44 +08:00   3
    他自己以前说过:自动的CPS变换. 用伪C代码解释一个:
    比如, 变换前的:
    int sum(int* arr, int len){
    if(len <= 0) return 0; else return arr[0] + sum(arr+1, len-1);
    }
    调用: print(sum([1,2,3,4], 4)) //输出 10;

    变换后的:
    void sum_cps(int sum, int* arr, int len, void (callback*)(int)){
    if(len <= 0) callback(sum);
    else sum_cps(sum + arr[0], arr+1, len-1, callback);
    }
    调用:(sum_cps, 0, [1,2,3,4], 4, print);
    这样变换以后, 自动变成尾递归. sum 每次递归调用需要把arr[0] 压栈, len大时会堆栈溢出, 而sum_cps,需要的栈为0, 不会堆栈溢出.
    递归调用是FP的根本, 所以自动实现这种变换意义很大.
    hitmoon
        8
    hitmoon  
       2013-03-04 16:40:46 +08:00
    感觉这种变换和迭代有点类似。
    wenbinwu
        9
    wenbinwu  
       2013-03-04 16:43:19 +08:00
    在美帝上学的有自信是好的,自负就不好了
    jiyinyiyong
        10
    jiyinyiyong  
    OP
       2013-03-04 19:51:53 +08:00
    @monkeydev 谢谢啦. 是一个入门级的 Node 博客.
    jiyinyiyong
        11
    jiyinyiyong  
    OP
       2013-03-04 19:52:34 +08:00
    @qiao @limu 想不通, 那为什么王垠本人对此特别推崇呢?
    wenbinwu
        12
    wenbinwu  
       2013-03-04 19:56:23 +08:00
    @jiyinyiyong 年轻~
    monkeydev
        13
    monkeydev  
       2013-03-04 20:45:24 +08:00
    @jiyinyiyong node表示是还是有点无能为力啊
    dingstyle
        14
    dingstyle  
       2013-03-04 21:59:29 +08:00   3
    楼上几位说得很清楚了,我在这里稍微补充一下:CPS的基本思想是将普通函数的return转换为调用另一个函数(即这个函数的continuation),由于函数永远都不会返回,我们也就不需要调用栈。举例来说呢,Chicken Scheme这样的编译器就会利用CPS来消除调用栈。
    另外,如果一个程序写成了CPS形式的话,call/cc这个special form可以用一个普通函数来实现:

    (lambda (f k) (f (lambda (v k0) (k v)) k))

    由于call/cc一直是解释器性能优化的一个难点,不难理解CPS转换对于现代函数式语言的编译器、解释器的重要意义了。
    jiyinyiyong
        15
    jiyinyiyong  
    OP
       2013-03-04 22:11:29 +08:00
    @dingstyle 那王垠做的这是什么?
    dingstyle
        16
    dingstyle  
       2013-03-05 00:36:49 +08:00 via iPad   1
    @jiyinyiyong 他做的是自动将一个普通程序转换为等价的CPS形式。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3296 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:22 PVG 12:22 LAX 20:22 JFK 23:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86