<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Worship FP</title>
    <description>神不为者，人为之；人不为者，我为之。</description>
    <link>http://wfp.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>为括号正名！</title>
        <author>lichray</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wfp.javaeye.com">lichray</a>&nbsp;
          链接：<a href="http://wfp.javaeye.com/blog/179821" style="color:red;">http://wfp.javaeye.com/blog/179821</a>&nbsp;
          发表时间: 2008年04月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          （教育用，大腕版，纯搞笑）<br /><br />一定要爱上括号<br />Scheme 一个都不能省的那种<br />Vim、Emacs 都能自动高亮括号对<br />看一眼就知道表达式是在哪个参数位置上返回的<br />心里别提多舒坦<br />没那个我现在都不知道怎么写程序！<br />用 Python 的时候<br />括号逗号元组连一块儿<br />三四层的函数调用就看不出来哪儿对哪儿了<br />Perl 光括号就七八种，还能自定义<br />鬼能背得得那匹配规则<br />Ruby 倒好<br />只省括号，但要被算符优先级<br />不是没事儿找事儿嘛<br />你看人家 Haskell 都学 Scheme 的括号规则<br />想用 $ 省几个？<br />你不先把括号打全了怎么省？<br />于是你用 Lisp，想省俩开始、结尾那括号<br />你都不好意思跟人打招呼<br />括号这种东西<br />就要一个字：多！<br />你也不想想人家为什么都用 letrec 不用 define<br />就是为了多打三层括号呗！<br />表达式套个七八层<br />if、cond 加个三四层<br />let、lambda 再加两层<br />你说这么着写程序<br />一千行 Scheme，我看怎么着也得四五千括号吧？<br />四五千，还得成对！<br />你还别不乐意<br />你看看那些个用命令式语言编程的<br />写个相同功能的程序<br />光等号就得打这么多！<br />然后他们还管那叫 IT(Irritating Testing)！<br />怎么，你想去试试？<br />想想看他们用的那 IDE<br />宏变换就不提了<br />连函数式语言的词法作用域都测不出来<br />Continuation？还是省了这条心吧<br />你得研究 Schemer 的心理<br />只要最清晰的，怕括号的都不是 Schemer<br />所以说<br />咱们用 Scheme 的口号就是<br />括号最多，一个不省
          <br/>
          <span style="color:red;">
            <a href="http://wfp.javaeye.com/blog/179821#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Apr 2008 12:53:54 +0800</pubDate>
        <link>http://wfp.javaeye.com/blog/179821</link>
        <guid>http://wfp.javaeye.com/blog/179821</guid>
      </item>
      <item>
        <title>Lua 的协同和 Scheme 的延续</title>
        <author>lichray</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wfp.javaeye.com">lichray</a>&nbsp;
          链接：<a href="http://wfp.javaeye.com/blog/160964" style="color:red;">http://wfp.javaeye.com/blog/160964</a>&nbsp;
          发表时间: 2008年02月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我记得某期《程序员》在介绍 Lua 时说“Lua 的协同程序类似 Scheme 的延续，只是自由度更高。”。我认为这样的说法是欠妥的，因为事实上协同的能力比延续要弱。<br /><br />首先来看下延续。理论上，延续是这样一种编程风格：对于每个函数，增加最后一个延续参数，所有的函数都不返回值，而把返回值作为参数传给延续参数。这样一来，建立延续标记的函数（如 call/cc）就可以获取调用路径中任何一个标记，并把它绑定到自己的参数函数的第一个参数上。看到 Scheme 的 call/cc，知道的人都会会心一笑，因为他古怪的标记绑定方法正是最初 lambda 演算隐藏掉所有的延续参数后的结果。实际上，延续为每个要标记的调用点在栈上都做了标记，使得调用路径上的函数可以跨越闭包设定的返回路径返回值到任意一个标记上。<br /><br />再来看协调程序。协同程序事实上是弱化了的延续。它只能标记出一个函数前一次延续绑定的位置，也就是说，对于某个调用路径上的函数来说，它最多只能跳回到上一次绑定的返回出口上。协同的能力介于正常返回值和延续之间。<br /><br />那么 Lua 这样做有什么意义呢？意义还是有的。一方面，真正标记出所有的位置是一个正常的编译器不可能做的事情。完全支持延续的编译器都对延续进行了大量优化，而且如果是较纯的函数式编程语言，还在闭包变换时可以消去对某些函数而言达不到的延续。但 Lua 虽然在支持 FP 方面比 Ruby，Python 之流做得更加出色，但本质上还是命令式语言，做这样的优化代价太大；另一方面，Scheme 是追求完备性的语言，需要用延续来辅助程序逻辑；Lua 因为是命令式语言，已经提供了不错的异常处理和生成器支持，也就是说延续能实现的主要的流程控制都以实现，完全实现延续以支持函数风格的自动回溯不再值得，Lua 只需要一个能够产生瘦线程的特性即可，不想要在函数间逻辑地、合理地任意跳转的能力，而协同就可以做到；最后一点，延续本身存在安全跟踪延续路径和清理上的困难（为此 Scheme 还额外提供了 dynamic-wind 来限制延续在闭包之外的重复跳转），为简化程序员的工作，增加限制不正是 RoR 等成功例子所颂扬的“约定大于配置”的金科玉律吗？
          <br/>
          <span style="color:red;">
            <a href="http://wfp.javaeye.com/blog/160964#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 01 Feb 2008 12:21:53 +0800</pubDate>
        <link>http://wfp.javaeye.com/blog/160964</link>
        <guid>http://wfp.javaeye.com/blog/160964</guid>
      </item>
  </channel>
</rss>