<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>函数式编程の道</title>
    <description>　代码这边独好　</description>
    <link>http://wfp.group.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>Erlang  Javascript v.s SquirrelFish</title>
        <author>sp42</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sp42.javaeye.com">sp42</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/211789" style="color:red;">http://wfp.group.javaeye.com/group/blog/211789</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          浏览器引擎WebKit小组正在忙一件事，就是升级他们的新JS引擎：SquirrelFish（金鳞鱼）。他们强调从不同的方案中集思广益（包括Lua等）,实现更快的JS解析速度。这令我想起另一边厢的引擎: erlyjs,用函数式语言Erlang写的JS引擎，号称“Javascript Flavoured Erlang”，Erlang的特点是非常适合多核，web服务...等..<br /><br />虽然没有什么量化的测评对比，但总的来说，他们在各自不同的知识领域做着同一件事情：JS引擎。<br /><br />。。哈哈～想说的是，我们Js发烧友福分不浅啊，那么多奇人异士在为JS世界的革新前赴后继。。<br />p。s。 webkit处理JS起来已经够快的了，还要快下去，岂不是傻快？ie的那些怎么办？<br /><br /><a href="http://code.google.com/p/erlyjs/" target="_blank">http://code.google.com/p/erlyjs/</a><br /><a href="http://www.infoq.com/cn/news/2008/06/SquirrelFishAnnouncement" target="_blank">http://www.infoq.com/cn/news/2008/06/SquirrelFishAnnouncement</a>
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/211789#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 03:59:11 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/211789</link>
        <guid>http://wfp.group.javaeye.com/group/blog/211789</guid>
      </item>
      <item>
        <title>scala学习笔记1</title>
        <author>dogstar</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dogstar.javaeye.com">dogstar</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/182673" style="color:red;">http://wfp.group.javaeye.com/group/blog/182673</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最早接触ruby时,从网上找一些资料看,零零碎碎,由于没有实际的使用动力,一直没有深入.有些点也没有理解.后来,工作需要深入学习js.js断断续续使用了两年.对js的了解也由浅入深.特别是接触了scheme,erlang等以后.了解到"披着c外衣的lisp"的含义.回过头来,看ruby,一切忽然开朗.同样的openclass,但多了一等公民的函数.<br /><br />扯了半天,回到主题.大家多看看fp语言,全当拓宽视野 :).对编写代码帮助很大.<br /><br />那就先从jvm的fp,scala开始吧 .<br />1.安装  scala http://www.scala-lang.org/downloads/index.html 下载下来的是一个jar安装文件 java -jar xxxxx.jar即可安装<br /><br />2.下载 eclipse插件 http://www.scala-lang.org/downloads/scala-plugin/. 直接eclipse install.<br />  安装成功的话,eclipse的scala环境就搭建完毕.<br /><br />3.写一个helloword程序,测试一下吧:<br />new scala project -> new scala Object <br /><pre name="code" class="java">
object HelloWorld {

        def main(args: Array[String]){
                println("hello,world")
         }
}
</pre><br /><br />then run as scala Application. 顺利的话,我们就会看到 "hello,world" 输出了.<br />(摘抄自附件的programming in scala. 日后会参考概述写点学习心得奉上.敬请关注. :))<br /><br /><br />4.参考资料 : 如附件
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/182673#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Mon, 14 Apr 2008 18:22:00 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/182673</link>
        <guid>http://wfp.group.javaeye.com/group/blog/182673</guid>
      </item>
      <item>
        <title>为括号正名！</title>
        <author>lichray</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wfp.javaeye.com">lichray</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/179821" style="color:red;">http://wfp.group.javaeye.com/group/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.group.javaeye.com/group/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Apr 2008 12:53:54 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/179821</link>
        <guid>http://wfp.group.javaeye.com/group/blog/179821</guid>
      </item>
      <item>
        <title>scheme解决约瑟夫环问题</title>
        <author>dennis_zane</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dennis-zane.javaeye.com">dennis_zane</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/174273" style="color:red;">http://wfp.group.javaeye.com/group/blog/174273</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>


&nbsp;&nbsp;&nbsp; 看了javaeye上一个解决约瑟夫环的问题的帖子，就想能不能用scheme来解决。如果采用推导出的数学公式来处理当然很简单了：<br />
</p><pre name="code" class="ruby">(define (joseph n m)
  (define (joseph-iter init s)
    (if (&gt; init n)
        (+ s 1)
        (joseph-iter (+ init 1) (remainder (+ s m) init))))
  (joseph-iter 2 0))</pre>&nbsp;&nbsp;<p>
&nbsp;&nbsp;&nbsp; 我想是否可以用一般的模拟算法来实现？也就是模拟一个循环链表，每次删除第m个元素。弄了个比较丑陋的实现：<br />
</p><pre name="code" class="ruby">(define (enumrate-interval low high)
  (if (&gt; low high)
      '()
      (cons low (enumrate-interval (+ low 1) high))))
(define (delete-last list)
  (if (eq? (cdr list) '())
      '()
      (cons (car list) (delete-last (cdr list)))))

(define (joseph-iter init list it) 
  (let ((m (remainder it (length list))))
   (cond ((= m 0) (delete-last list))
         ((= m 1) (append (cdr list) (reverse init)))
         (else
           (joseph-iter (cons (car list) init) (cdr list) (- m 1))))))
(define (joseph n m)
    (define (joseph-list list m)
      (display list) 
      (newline)
      (if (eq? (cdr list) '())
          (car list)
          (joseph-list (joseph-iter '() list m) m)))</pre>&nbsp;<p>&nbsp;</p>
<br />
计算（joseph 8 3)的过程如下：<br />
(1 2 3 4 5 6 7 8)<br />
(4 5 6 7 8 1 2)<br />
(7 8 1 2 4 5)<br />
(2 4 5 7 8)<br />
(7 8 2 4)<br />
(4 7 8)<br />
(4 7)<br />
(7)<br />
7<br />
<br />
看了这个计算过程就知道我这个方法多糟糕，每次都重新构造列表。不知道牛人们有没有更好的思路来实现模拟算法？<br />
<br /> 
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/174273#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 19:18:14 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/174273</link>
        <guid>http://wfp.group.javaeye.com/group/blog/174273</guid>
      </item>
      <item>
        <title>约瑟夫环问题 </title>
        <author>chenchuxin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chenchuxin.javaeye.com">chenchuxin</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/173518" style="color:red;">http://wfp.group.javaeye.com/group/blog/173518</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          约瑟夫环问题 <br /> <br />　　约瑟夫环（Josephus）问题是由古罗马的史学家约瑟夫（Josephus）提出的，他参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫作为一个将军，设法守住了裘达伯特城达47天之久，在城市沦陷之后，他和40名死硬的将士在附近的一个洞穴中避难。在那里，这些叛乱者表决说“要投降毋宁死”。于是，约瑟夫建议每个人轮流杀死他旁边的人，而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签，并且，作为洞穴中的两个幸存者之一，他说服了他原先的牺牲品一起投降了罗马。<br />　　约瑟夫环问题的具体描述是：设有编号为1，2，……，n的n(n>0)个人围成一个圈，从第1个人开始报数，报到m时停止报数，报m的人出圈，再从他的下一个人起重新报数，报到m时停止报数，报m的出圈，……，如此下去，直到所有人全部出圈为止。当任意给定n和m后，设计算法求n个人出圈的次序。  <br /><br /><br /><br /> <pre name="code" class="c">#include &lt;stdio.h>
main()
{
   int n, m, i, s=0;
   printf ("N M = "); scanf("%d%d", &n, &m);
   for (i=2; i&lt;=n; i++) s=(s+m)%i;
   printf ("The winner is %d\n", s+1);
}/*运用了一点数学策略 N=8 M=3 幸存为7 ;少于3的时候还可以数,因为为一个环;从他的下一个人起重新报数*/</pre>
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/173518#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 20:47:29 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/173518</link>
        <guid>http://wfp.group.javaeye.com/group/blog/173518</guid>
      </item>
      <item>
        <title>因为你是男人 - 崔晓柏</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/170640" style="color:red;">http://wfp.group.javaeye.com/group/blog/170640</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>因为你是男人</strong><br /><br />       当母亲带着疲惫的微笑将你捧给世界，你已经是一座高山，是一片大海了。性别交给你一副重担，指给你一条路，对你说：走吧，你这男子汉！于是你便要长一副铮铮铁骨，把脚下坚实的土地踏得咚咚作响，去完成你的使命、你的光荣、你的答卷。 <br /><br />        当洪水涌来的时候，你要退在最后；当大火燃烧的时候，你却要扑在前边。因为你是男人，你就应该有一副侠肝义胆！ <br /><br />        当朋友成功的时候，你要大碗喝酒；与女友分手时，要真诚地说声道歉。因为你是男人，你就应该如此气壮心宽。 <br /><br />        因为你是男人，所以，对女儿你应是一棵结满故事的大树，对妻子你应是一片金色的沙滩，对父母更该是一座物产丰富的大山。 <br /><br />        因为你是男人，一生就要有所成就。不懒惰，不侥幸，不虚荣，不欺骗，不流泪，不妒嫉，不后悔，不自卑，不献媚，不投机，不唯利是图，不    抱怨，男人就应该堂堂正正、磊磊落落、风度翩翩。 <br /><br />        做个好男人也是一项事业啊。一个民族仅有女人的光荣是不够的，阴盛阳衰对每个男人来说都应该觉得行秽自惭。 <br /><br />        也许你很矮，但好男人博大的胸怀才情会使你顶天立地；也许你很弱，但好男人坚定的意志品格将赋予你狭义铁肩；也许你恶疾缠身，但好男人的字典里根本没有伤残。 <br /><br />        男人，光荣的性别。这光荣的全部内涵就在于去承担责任和义务做出牺牲和奉献。做个好男人吧！你别无选择，因为你已经是个男人了。
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/170640#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Mar 2008 20:56:58 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/170640</link>
        <guid>http://wfp.group.javaeye.com/group/blog/170640</guid>
      </item>
      <item>
        <title>四个程序员的一天</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/170076" style="color:red;">http://wfp.group.javaeye.com/group/blog/170076</a>&nbsp;
          发表时间: 2008年03月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          你，一个DotNet程序员，刚刚加入一个新项目组。除了你之外，其他的成员包括：Ceer，一直从事C项目的程序员，他刚刚转入C#不到一个月； Jally，整天抱着本Design Pattern（没错，就是GoF的那本）在啃的前Java程序员；以及Semon，你对他完全不了解，只是听PM介绍说他是搞Scheme的（传说中的第二古老的语言LISP的方言之一）。不过你也没在意，毕竟计算机这玩意，老东西是不吃香的。 <br /><br />　　周一，刚打开电脑，老板就跑到你们组的办公座面前：&ldquo;好吧，伙计们，现在有个function需要你们来搞定。具体是这样的：用户输入2个数，并输入一个操作符。你根据输入的情况来得出相应的运算结果。&ldquo;<br /><br /><pre name="code" class="java">Example： Foo(+, 1, 2) = 3; Foo(*, 3, 6) = 18; Foo(/, 2, 4) = 0.5</pre><p> <br />　　Ceer最先作出反应：简单嘛，判断一下输入的操作符就好了。说着，他很快在白板上写出如下代码：</p><p>&nbsp;</p><pre name="code" class="c#">public class CStyle_Calculator
{
　static public double Foo(char op, double x, double y)
　{
　　switch(op)
　　　case &rsquo;+&rsquo;: return x + y; break;
　　　case &rsquo;-&rsquo;: return x - y; break;
　　　case &rsquo;*&rsquo;: return x * y; break;
　　　case &rsquo;/&rsquo;: return x / y; break;
　　　default: throw new Exception(&rdquo;What the Hell you have input?&quot;);
　}
}</pre>&nbsp;<br />　　Jally只看了一遍，就捂着鼻子连连摇头：好一股的代码臭味。还不如看我用OO的方法来解决：<br /><br /><pre name="code" class="c#">public interface I操作符 //谁说代码不能写中文的？恩恩
{
　double 运算(double x, double y);
}

public class OO_Calculator
{
　private I操作符 m_op;
　public OO_Calculator(I操作符 op)
　{
　　this.m_op = op; //依赖注入【注2】
　}

　public double Foo(double x, double y)
　{
　　return this.m_op.运算(x, y);
　}
}

public class 加法:I操作符
{
　public double 运算(double x, double y)
　{
　　return x + y;
　}
}

public class 减法:I操作符
{
　public double 运算(double x, double y)
　{
　　return x - y;
　}
}

public class 乘法:I操作符
{
　public double 运算(double x, double y)
　{
　　return x * y;
　}
}

public class 除法:I操作符
{
　public double 运算(double x, double y)
　{
　　return x / y;
　}
}

public class TheMainClass
{
　static public void Main()
　{
　　I操作符 我的加法 = new 加法();
　　OO_Calculator 我的加法器 = new OO_Calculator(我的加法);
　　double sum = 我的加法器.Foo(3, 4);
　　System.Console.WriteLine(sum);
　　//sum = 7

　　//其他3个我就不废话了
　}
} </pre>&nbsp;<br />　　你看着Jally把白板写得密密麻麻之后，耸耸肩，暗叹，你们这些用java的废柴，就一个运算器还搞出Interface这些东西，烦不烦啊。 让你们见识见识DotNet的强大吧. 那个运算符我直接用delegate传进去不就好了么.<br /><br /><pre name="code" class="c#">public delegate double TheOperator(double x, double y);

public class Operators
{
　static public double Add(double x, double y)
　{
　　return x + y;
　}

　static public double Sub(double x, double y)
　{
　　return x - y;
　}

　//乘，除法 我也懒得废话了
}

public class DotNet_Calculator
{
　public double Foo(TheOperator op, double x, double y)
　{
　　return op(x, y);
　}
}

public class TheMainClass
{
　static public void Main()
　{
　　TheOperator myAdd = new TheOperator(Operators.Add);
　　TheOperator mySub = new TheOperator(Operators.Sub);

　　DotNet_Calculator dc = new DotNet_Calculator();
　　double sum = dc.Foo(myAdd, 2, 4); //sum = 6
　　System.Console.WriteLine(sum);
　　double sub = dc.Foo(mySub, 3, 7); //sub = -4
　　System.Console.WriteLine(sub);
　}
}</pre>&nbsp;<br />//dot net 下面还可以用CodeDom动态构造C＃代码，然后在内存编译运行。<br />//如果觉得专门写个Operators很烦的话，可以试试C＃2.0的匿名方法 <br /><br />　　很好，当你写完代码之后，挑衅的看着Jally，Ceer却开始抱怨起来：&rdquo;这不就是C里面的函数指针么，我也会...&ldquo; <br /><br />　　&ldquo;然则DotNet下面的Delegate是类型安全滴...&rdquo;你继续洋洋得意.<br /><br />　　而Semon，看了看你们3位华丽的代码，啥也没说，只是在键盘上敲下了2行代码<br /><br /><pre name="code" class="c">(define (Foo op x y)
(op x y)) </pre>&nbsp;<br />　　然后就下班了...<br /><br />　　【注： scheme的代码稍微解释下：(+ 1 2) = 3, (* 3 4) = 12.】<br /><br />　　至于Semon的解法：<br /><br /><pre name="code" class="c">(define (Foo op x y)
(op x y)) </pre>&nbsp;<br />　　看明白了么，上面的代码只有一个作用：第一行是函数头，定义了一个叫Foo的函数。该函数接受3个参数op, x, y。<br /><br />　　第二行定义了函数的行为：把第一个参数op当作运算符，计算后面2个参数。<br /><br />　　所以：（Foo + 1 2) = 3. (Foo / 12 6) = 2.<br /><br />　　好了好了，不编故事了。<br /><br />　　我只是想简单的让大家在繁忙的工作之余，也瞅瞅Function Programming（函数编程）世界的美妙。函数编程，最大的特点是它是将函数作为语言里1st class的元素来对待的。一个函数可以接受另一个函数作为参数，也可以把一个函数作为结果来返回。这样的函数我们称为Higher-order function。<br /><br />　　那么，Function Programming和我们传统的面向对象有啥区别捏？ 恩，这个嘛，扯得远可以扯到图灵机和冯&middot;诺以曼这2种体系的差异...@_@不过那个太学术性，俺就不说了。不过有句话可以较好的概括FP和OO的区别（好吧，这个也是抄&ldquo;紫皮书&rdquo;上面的）：<br />　<br />　　&ldquo;Pascal是为了建造金字塔...Lisp是为了建造有机体...&rdquo;&ldquo;作为Lisp的内在数据结构，表对于这种可用性起着重要的提升作用...&rdquo;&ldquo;采用100函数在一个数据结构上操作，远远优于采用10个操作在十个数据结构上工作&rdquo;&ldquo;金字塔矗立在那里千年不变，而有机体则必须演化，否则就会消亡&rdquo;。<br /><br />　　而另一个总结得比较好的话是：（同样是抄来的）<br /><br />　　一个对象：一组相同的运算上面，外加不同的数据。（想想你的object，是不是这样的？）<br /><br />　　一个Closure：一组相同的数据，外加不同的操作。（Delegate就是这样的思想，有兴趣的话也可以去看看Ruby）<br /><br />　　基本上，恩，没啥说的了。 如果你感兴趣的话，可以去看MIT SICP的课程（有在线版的，MIT也作为Open Course开设了的）&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/170076#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Tue, 11 Mar 2008 10:48:56 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/170076</link>
        <guid>http://wfp.group.javaeye.com/group/blog/170076</guid>
      </item>
      <item>
        <title>Emacs Lisp中的hash table</title>
        <author>Jamsa</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jamsa.javaeye.com">Jamsa</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/169893" style="color:red;">http://wfp.group.javaeye.com/group/blog/169893</a>&nbsp;
          发表时间: 2008年03月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          (defun zj-hash-test ()<br />&nbsp; &quot;hash table 测试&quot;<br />&nbsp; (interactive)<br />&nbsp; (let (myhash val)<br />&nbsp;&nbsp;&nbsp; ;; 创建hash table并告诉elips用equal来测试key是否存在<br />&nbsp;&nbsp;&nbsp; (setq myhash (make-hash-table :test 'equal))<br /><br />&nbsp;&nbsp;&nbsp; ;; 添加数据<br />&nbsp;&nbsp;&nbsp; (puthash &quot;key1&quot; &quot;19&quot; myhash)<br />&nbsp;&nbsp;&nbsp; (puthash &quot;key2&quot; &quot;1ddd&quot; myhash)<br />&nbsp;&nbsp;&nbsp; (puthash &quot;key3&quot; &quot;1te&quot; myhash)<br />&nbsp;&nbsp;&nbsp; (puthash &quot;key4&quot; &quot;19&quot; myhash)<br /><br /><br />&nbsp;&nbsp;&nbsp; ;; 修改数据<br />&nbsp;&nbsp;&nbsp; (puthash &quot;key1&quot; &quot;2334dd&quot; myhash)<br /><br />&nbsp;&nbsp;&nbsp; ;; 删除数据<br />&nbsp;&nbsp;&nbsp; (remhash &quot;key3&quot; myhash)<br /><br />&nbsp;&nbsp;&nbsp; ;; 获取数据<br />&nbsp;&nbsp;&nbsp; (setq val (gethash &quot;key2&quot; myhash))<br />&nbsp;&nbsp;&nbsp; (message val)<br />&nbsp;&nbsp;&nbsp; )<br />&nbsp; )
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/169893#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Mon, 10 Mar 2008 16:30:24 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/169893</link>
        <guid>http://wfp.group.javaeye.com/group/blog/169893</guid>
      </item>
      <item>
        <title>Emacs Lisp与Shell的交互</title>
        <author>Jamsa</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jamsa.javaeye.com">Jamsa</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/169891" style="color:red;">http://wfp.group.javaeye.com/group/blog/169891</a>&nbsp;
          发表时间: 2008年03月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p> 一直以来对于w3m、tramp、dired等与shell关系密切的mode不是很了解，没有仔细读过代码。但总觉得应该是调用shell命令，再将shell命令的输出重定向到emacs中进行处理。今天在网上看到了相关的方法：</p><ol><li>调用shell命令<pre name="code" class="java">(defun zj-open-directory-with-explorer ()
  &quot;在windows中用explorer浏览当前目录&quot;
  (interactive)
  (shell-command &quot;explorer.exe .&quot;)
  (browse-url &quot;www.google.cn&quot;)
  )
</pre>&nbsp;</li><li>处理shell命令输出<pre name="code" class="java">(defun zj-display-directory-files ()
  &quot;执行shell命令并处理它的输出。这里为显示当前目录下的文件&quot;
  (interactive)
  (message (shell-command-to-string &quot;ls -l&quot;))
  )</pre>&nbsp;</li></ol><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/169891#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Mar 2008 16:27:41 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/169891</link>
        <guid>http://wfp.group.javaeye.com/group/blog/169891</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.group.javaeye.com/group/blog/160964" style="color:red;">http://wfp.group.javaeye.com/group/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.group.javaeye.com/group/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 01 Feb 2008 12:21:53 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/160964</link>
        <guid>http://wfp.group.javaeye.com/group/blog/160964</guid>
      </item>
      <item>
        <title>递归下降语法分析详解</title>
        <author>Lich_Ray</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lichray.javaeye.com">Lich_Ray</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/155321" style="color:red;">http://wfp.group.javaeye.com/group/blog/155321</a>&nbsp;
          发表时间: 2008年01月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">本文以 lichray 设计的 S-dict(t) 配置文件解析器为例，简单介绍了词法分析器的原理，详细讲述了递归下降语法分析器手工构造方法。因为该项目本身已经完成，故此本文拥有一个实际可用的例子，是不可多得的入门教程。</div><br /><div class="quote_title">引用</div><div class="quote_div">T1 大人说过，技术的迅速贬值是十分残酷的，比如大部分的手工优化代码，早已被编译器们代劳。这篇文章中要说的递归下降语法分析方法也是严重贬值了的技术之一。不过我认为，在享受着别人构造的自动化工具同时，知道其原理还是很重要的。一个典型的例子就是正则表达式——大家都会用，能保证写对的人也很多，但看了专家们的解答后都自愧不如——原因很简单：你会写正则表达式的编译器吗？<br />不过这篇文章并不是在教你怎样写 yayacc，只是希望你能从中体会到工具的思想并能更好地组织头脑中的 BNF 产生式。当然了，用这种方法手工构造一个代码语法高亮程序也是个不错的想法。</div><br /><br />很多人都是从《C 编程语言》这本书上听说递归下降这种优美的语法分析器手工构造方法的，但这“很多人”中的很多人事实上没有看懂或者是看懂了就是构造不出自己的语法分析器。我三个月前完成了自己设计的 S-dict(t) 解析器，找到一个来理清这里面思路的好机会。<br /><br /><span style="font-size: medium"><strong>S-dict(t) 简介</strong></span><br />这是作者设计的一直配置文件和数据交换格式，语法类似 Scheme，支持多种数据类型甚至包括迭代器。具体的示例文件太长，在附件中可获得。它的解析器相当于只把编程语言的解析过程做到语法分析树构造这一步，天然的例子。<br /><pre name="code" class="java">
main ::= {tree}
tree ::= '(' id leaf ')'
leaf ::= exps | main
exps ::= [{exp}]
exp  ::= id | bool | num | str | arr | low
id   ::  [^#\.\d\(\)\[\]\{\}'"`,;+-][^\s\(\)\[\]\{\}'"`,;]*
bool ::  #t|#f|#T|#F
num  ::  [+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?
str  ::  '\'' [{chr}] '\'' | '"' [{chr}] '"'
low  ::  #[^\s\(\)\[\]\{\}'"`,;]*
chr  ::= any-Unicode-character-except-"-or-\-or-control-character | 
		\" | \\ | \0 | \b | \7 | \f | \n | \r | \t | \v | 
		\x two-hex-digits | \u four-hex-digits
number
arr  ::= '[' arrc ']'
arrc ::= [{exp}]
comt ::  ^\s*#.*$
</pre><br />以上它的完整的 E-BNF 产生式，是实现解析器的根据，在下面两章会被用到。<br /><br /><span style="font-size: medium"><strong>词法分析：到底是什么</strong></span><br />《现代编译原理》这本书上对词法分析的介绍尤为生动，生动的结果就是给人一种错觉：词法分析需要完整地解析正则表达式，连接有穷自动机，所以手工实现，难度不亚于给自动机作数学注明。但那只是语言学的理论分析结果。在实际应用中，如果有什么语言的词法分析需要严格地完全连接非确定有穷自动机，那只能说明这个语言设计地很“令人困惑”。<br />词法分析器只不过是这样的一个程序：你给它要分析的程序源代码，它返回一个数组，数组中的每一项都是正确分割了的词法元素。比如对于一段 S-dict(t) 代码：<br />(i (name 'lichray')<br /> (age 13))<br />它应该返回 ['(', 'i', '(', 'name', "'lichray'", ')', '(', 'age', 13, ')', ')']。当然了，这种做法是比较简易的，通用的做法应当是给每个词法元素一个数据类型，然后返回相应的对象/实例/结构。构造它，根据词法元素表照抄即可。<br /><pre name="code" class="java">
## 这些全是正则表达式
id   ::  [^#\.\d\(\)\[\]\{\}'"`,;+-][^\s\(\)\[\]\{\}'"`,;]*
bool ::  #t|#f|#T|#F
num  ::  [+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?
str  ::  '\'' [{chr}] '\'' | '"' [{chr}] '"'
low  ::  #[^\s\(\)\[\]\{\}'"`,;]*
main ::  \(
end  ::  \)
arr ::  \[
narr ::  \]
</pre><br />解析字符串的思路大致是这样：对每个词法元素写一个函数，以一个主函数完成词法元素的判断过程，并调用相应的函数解析。每完成一个元素的解析，就返回拆解下来的结果和字符串的剩余部分，将这些数据，结果、剩余字符串和行号返回给主函数继续。<br /><pre name="code" class="javascript">
// 这个函数就可以完成这样的工作
// ssub(string, pattern) 同时返回 pattern 匹配 string 后的结果和余下的字符串
function ssub (s, p) {
	var ss = p.exec(s)[0]
	return [ss, s.slice(ss.length)]
}
// 弹出下一个单词
function word (s) {
	return ssub(s, /^[^\s\(\)\[\]\{\}'"`,;]+/)
}
// 弹出下一个“东西”，仅用于报错
function gew (s) {
	return /^[^\s\(\)\[\]'"]+/.exec(s)[0]
}
// 还真的报错了
function error (m, ln) {
	throw Error (m+" in line "+ln)
}
</pre><br /><pre name="code" class="javascript">
	// 先给出判断语法元素的函数，它们的参数是剩余的字符串
	// 剩余的字符串没有了，整个代码也到头了
	function isEOF (c) { return c == "" }
	function beLine (c) { return c[0] == '\n' }
	function beSpase (c) { return /\s/.test(c[0]) }
	function beId (c) { return /[^#\.\d\(\)\[\]\{\}'"`,;+-]/.test(c[0]) }
	function beBool (c) { return c[0] == '#' }
	function beNum (c) { return /[-+\d\.]/.test(c[0]) }
	function beStr (c) { return c[0] == '\'' || c[0] == '\"' }
	function beMain (c) { return c[0] == '(' }
	function beEnd (c) { return c[0] == ')' }
	function beArr (c) { return c[0] == '[' }
	function beNarr (c) { return c[0] == ']' }
</pre><br />似乎很繁琐。真的吗？可别忘了我整个程序近400行代码可只写了8行注释哦~`<br />注意：事实上，S-dict(t) 解析器并没有使用独立的词法分析器，而是把词法分析和语法分析同时完成了，而且本文并非以讲解词法分析为主。所以下面的代码虽然放在源代码文件中时几乎实际可运行，但没有被实际采用。<br /><pre name="code" class="javascript">
/* 基本函数 */
// 连接项目与列表
function cons (o, l) {
	return [o].concat(l)
}
// 取列表除去第一项后余下的部分
function cdr (l) {
	return l.slice(1)
}
// 消除左侧除换行之外的空白
function strim (s) {
	return s.replace(/^\s+?(?=\n)?/,'')
}

/* 词法分析器 */
// 标准的正则尾递归优化写法。尽管 JavaScript 不支持优化，但不失为一种很好的组织程序的手段
// 使用时调用 slex(string, [], 1)，参数 t 用来暂存分析数组
function slex (s, t, ln) {
	if (isEOF(s)) return t.reverse()
	var tmp = []
	// 用 ln 参数保存行数
	if (beLine(s)) return slex(cdr(s), ln+1)
	if (beSpase(s)) return slex(strim(s), ln)

	else if (beBool(s)) tmp = bool(s, ln)
	else if (beNum(s)) tmp = num(s, ln)
	else if (beId(s)) tmp = id(s, ln)
	else if (beStr(s)) tmp = str(s, ln)
	else if (beMain(s)) tmp = main(s, ln)
	else if (beEnd(s)) tmp = end(s, ln)
	else if (beArr(s)) tmp = arr(s, ln)
	else if (beNarr(s)) tmp = narr(s, ln)
	else error("Unknown Value: "+gew(s), ln)

	return slex(tmp[1], cons(tmp[0], t), tmp[2])
}

/* 所有的词法元素的解开过程 */
// 每个函数返回的第三个值是新的行号
// 此处省略，详见附件源代码 179-222 行
// 源代码中 arr、narr、main、end 几个函数都是语法分析的版本，
// 以 arr 举例说明这一系列函数的共性
function arr (s, ln) {
	return ['[', cdr(s), ln]
}
// 其他的函数只不过是使用了 ssub() 函数通过正则表达式解析了而已。
</pre><br />这里注意一下：为什么没有 low 词法元素的处理函数？在源代码中也可以看到，因为 low 和 bool 共用同一个起始字符，所以解析函数也被写到了一起。最后一章将会解释这样做的意义。<br /><br /><span style="font-size: medium"><strong>语法分析：词法分析立体版</strong></span><br /><br /><strong>语法分析的目的</strong><br />无论是生成抽象语法树（AST）还是算符优先栈还是别的什么数据结构，我们发现，最终在根据分析结果执行代码时，其实都是在做一个树形过程，都需要逻辑上的一个立体的数据结构。语法分析的，就是通过获取平面的词法分析结果，根据语法结构描述（比如 BNF）输出立体的数据结构。在 S-dict(t) 这个例子中，我们选择的数据结构是 JavaScript 对象构成的树。例如代码<br />(i (name 'lichray')<br /> (age 13))<br />的分析结果应该是：<br />{i: {name: 'lichray', age:13}}<br />限制是：一个树枝上如果有叶子或其他树枝，整个树枝的下属必须全部是叶子或树枝而不能是数据；数据只能出现在叶子上。<br /><br /><strong>E-BNF 和 BNF</strong><br />除了知道语法分析的“来龙去脉”，还需要一样描述语法语法结构的形式语言。现在的教科书上所教授的一般是扩展的巴菲斯-劳尔范式(E-BNF)，但是事实，E-BNF 相对于 BNF，存在一个很有意思的问题：那就是自由度过大。除非按照教科书上的方法消除左递归，否则往往很难手工构造。事实上，我上文中给出的 E-BNF 也并非一开始就是那样，<br /><pre name="code" class="java">
main ::= {tree}
tree ::= '(' id leaf ')'
leaf ::= exps | main
</pre><br />这三句很明显可以被非常直接地合并成<br /><pre name="code" class="java">
tree ::= '(' id exps | {tree} ')'
</pre><br />一句。但这样你就不得不把构建分析表的工作交给 yacc 之类的工具了，因为你没有写出全部的语法元素。<br />而 BNF 可以强迫你写出大部分需要递归描述的语法元素，并且可以直接地指定语法的结合方向。S-dict(t) 的 BNF 如下：<br /><pre name="code" class="java">
// e 代表为空，对应的希腊字母
// 当然也可以消除 e，把为空表现在上级产生式中
main ::= tree | tree main
tree ::= '(' id leaf ')'
leaf ::= exps | main
exps ::= e | exp | exp exps
exp  ::= id | bool | num | str | arr | low
arr  ::= '[' arrc ']'
arrc ::= e | exps
</pre><br />会心一笑：我的 E-BNF 为什么写成了那个怪样子，其实就是从 BNF 逐句转来的。<br />知道了语法元素的递归方向，不需要消除递归，只需把每个元素的解析过程表示为函数，把要执行的全局代码插入函数体，然后把 BNF 的逻辑直接而机械得转为函数间的递归调用，语法分析器就写出来了。BNF 中只有选择和递归两种逻辑，下面是对它们的编码示例。<br /><pre name="code" class="javascript">
// 参数 ls 是词法分析结果
function sdict (ls) {
	var index = ["~"]  //对象树节点名的线型访问栈
	var root = {}      //全局的对象树
	var stack = [root] //对象树节点的线型访问栈

	// 对照 BNF，不难发现解开递归的技巧：
		/* 把对起始符和终结符的处理写在函数中，递归部分一直向下推迟，
		   直到 exps 这个产生式被终结时再调用回 main() */
	// main ::= tree | tree main
	function main (ls, ln) {
		if (ls == false)
			if (!canPop(stack))
				return
			else error("Lack of end quotes", ln)
		else if (beMain(ls[0]))
			tree(cdr(ls), ln)
		else if (beEnd(ls[0]))
			if (canPop(stack)) {
				// 语法分析 main 结束就弹出一个数据栈，一条树枝结束了
				stack.pop()
				main(cdr(ls), ln)
			}
			else error("To many end quotes", ln)
		else error("Wrong Syntax: "+ls[0], ln)
	}

	function tree (ls, ln) {
		// 这是一个一步推导产生式的例子
		// tree ::= '(' id leaf ')'
		if (beId(ls[0])) {
			var tmp = id(ls[0])
			// 这些就是插入的全局数据结构更新代码，向栈中增加索引
			add_index(stack, tmp[0])
			leaf(tmp[1], ln)
		}
		else error("Not an Id: "+ls[0])
	}

	/* 详细参见源文件74-143行，把每个函数处理空白的代码去掉，
	   参数s替换为 ls，函数体内替换为 ls[0] 就是独立语法分析的版本。 */
}
</pre><br /><br /><span style="font-size: medium"><strong>合并词法分析和语法分析</strong></span><br /><strong>简单的优化</strong><br />把所有的小函数全部作内联，展开代码到被调用的地方。这样一来，判断起始符号的函数就可以全部消灭（顺便提一句，使用静态多态类型的纯函数式编程语言，如 Haskell、Ocaml、ML，写的语法分析器自动生成器不需要这种优化，因为语言本身就已经帮你做了）。当然了，作为应用“优化”手段的一般代价，就是代码看不懂了。<br /><br /><strong>一趟分析</strong><br />S-dict(t) 的解析器事实上使用了一趟分析的技术，把词法分析和语法分析合并到一起完成，不使用词法分析生成的中间数组，提高解析效率。方法是把语法分析提取 ls[0] （即当前元素）的过程扩写为从 s （剩余的源代码）中弹出下一个词法元素的过程。实例代码就是源代码中的 sdict() 函数，就不列在这儿了。<br /><br /><span style="font-size: medium"><strong>引发的联想</strong></span><br />从上面三章我们不难看出，词法分析、语法分析、一趟分析其实都是一个非常机械的过程，完全可以用工具自动生成代码。词法分析器生成器是最简单的，可以直接生成全部代码，像 flex 做的那样，连同逻辑一起硬编码；也可以像 lex 那样，提供固定的解析代码，只生成非确定有穷自动机的分析表。语法分析要稍复杂一点，问题在于如何判断什么时候该规约（确定下面调用哪一个分析函数）什么时候该移进（更新分析结果，继续向下递归）。这需要判断终结符和产生式之间的关系。最简单的判断方法是 LL(1)，也就是说统一只向下查看一个字符。这也就是我们这个例子中使用的方法。但这种方法较容易产生歧义，需要使用者自己修正解析代码。这就是 S-dict(t) 中 bool 和 low 的解析写成了一个函数的原因。antlr 就是用了 LL(1) 分析，不过它带有连接词法分析和语法分析的能力。yacc 使用的是 LR() 分析，一种带有回溯能力的强大的自动分析方法，克努特天才的创造。也许以后会有机会给大家讲到这个。
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/155321#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Jan 2008 22:08:31 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/155321</link>
        <guid>http://wfp.group.javaeye.com/group/blog/155321</guid>
      </item>
      <item>
        <title>形式化系统——数学或逻辑能力的局限？</title>
        <author>SilenceCliff</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://silencecliff.javaeye.com">SilenceCliff</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/151851" style="color:red;">http://wfp.group.javaeye.com/group/blog/151851</a>&nbsp;
          发表时间: 2007年12月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;做否证是个&ldquo;缺德&rdquo;的事，有点那么&ldquo;一将功成万骨枯&rdquo;的韵味，也有点那么&ldquo;舍我其谁，颐指气使&rdquo;的嚣张劲。做&ldquo;否证&rdquo;，砸了一个行当，肥了一己之私。哥德尔，算不上空前绝后，但就影响，堪称深远。或许几千年来为人所迷惑，唯此君拨开云雾尚算不上经典，只怕数百年后，人人仍口口相传，其洞见历久弥坚，犹如笛卡尔，方可算一代大家。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同所有的否证一样，尺规问题的代数化破灭了&ldquo;三等分角&rdquo;、&ldquo;倍立方体&rdquo;、&ldquo;化圆为方&rdquo;。哥德尔不完备定理也彻底让希尔伯特的&ldquo;元数学&rdquo;计划破产。GEB里不无有趣的调侃其&ldquo;阿拉丁神灯&rdquo;的段子。&ldquo;愿望类型化&rdquo;、&ldquo;元灯&rdquo;、&ldquo;元怪物&rdquo;、&ldquo;元元怪物&rdquo;&hellip;&hellip;罗素的类型化从逻辑为基础重塑数学大厦，但应用到现实颇为繁琐，主流上，从集合论公理化（ZFC）解决了<strong>可怕的罗素悖论</strong>，数学大厦之基得以保全。虽根基得以幸免，然则疆域却被哥德尔硬生生给划拨了一块去了神秘的未知。数学、逻辑并非万能！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 人工智能先驱们也有彷徨，无论确定形式系统怎样的一集公理，其不完全皆已根深蒂固、先天决定。人，才是系统外洞察秋毫之神明。智慧，则潜藏在这洞察之中，这一集公理之外。马尔文&middot;明斯基如是说：&ldquo;感觉，而非逻辑，那正是智能之所在！&rdquo;直觉主义与形式主义的PK似乎，这一段落下，笛卡尔之流这样的二元论者着实是占了上风。不得不感叹400年前，这位爱睡懒觉、&ldquo;我思故我是&rdquo;的先贤之深思远见。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 罗素、怀特海的《数学原理》仍被奉作今逻辑之正统经典，其规划的类型体系杜绝了悖论，逻辑之旁枝声势依然孱弱。达&middot;斯科特的<strong>次协调逻辑</strong>在这众多派系中并不显眼。或许该成果只是专营之堆砌，但其大胆弱化矛盾律，抛弃司各脱律之创见，愚深以为然！！！如作者之比喻，关于几何平行第五公设之解禁，非欧几何，奇葩般绽放盛开。并非所有矛盾都是无意义的！这不正是黑格尔和维特根斯坦的哲学远见之所在吗？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或许对待矛盾、悖论，我们换副眼镜，变个万花筒，智能是什么？这就更清澈了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/151851#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Dec 2007 16:53:53 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/151851</link>
        <guid>http://wfp.group.javaeye.com/group/blog/151851</guid>
      </item>
      <item>
        <title>Intel NDA 协议</title>
        <author>wickyl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wickyl.javaeye.com">wickyl</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/148964" style="color:red;">http://wfp.group.javaeye.com/group/blog/148964</a>&nbsp;
          发表时间: 2007年12月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="4">我最近正在作一个面向底层的开发工作，具体上说，是围绕内存制造与测试的工作。<br />
这个项目就是为很多内存制造商提供测试方案，用于快速的检测内存模组的测试。<br />
<br />
应对众多厂家的要求，我需要在软件的界面上显示测试的环境信息，这包括 CPU 速度和<br />
cache 信息，SDRAM 的速率，通道模式，时序信息。时序信息包括了 CL，tRCD，tRP，tRAS。<br />
当然还包括内存测试方案的信息，和测试状态信息。<br />
<br />
CPU 的大致信息，你可以通过 CPUID 指令获得，而亦可以用 rdtsc 读取系统的时间戳来算<br />
到 CPU 的实时速率。这个方法对于大多数 CPU 都是可行的，少数不支持 CPUID 指令的就<br />
是例外。<br />
<br />
SDRAM 的信息大多数存储于主板的芯片组中，北桥的内存控制器管理着内存的工作方式和监<br />
督其工作状态。拿 Intel 为例，自 945 以前的芯片组，其资料都是公开的，参照官方的<br />
Intel Datasheet，你可以获得 PCI 设置参数的读取方法。所有的信息乃至支持的模组类型，<br />
可控的时序范围都是可以读到的。大家用到的 CPU-Z，都应该是这样读到的。<br />
<br />
然而，到了 965 时代，这一切都发生了改变。从 965 Datasheet 资料上看，这片资料也相<br />
对比较完整。但是 Chipset 寄存器的组织结构却发生了变化，寄存器组的分工更加的明确<br />
和正式化。按照原先的想法，这并没有什么不妥。毕竟 965 是转向 Intel 3 系列的实验板。<br />
但是在我们用老的方法读取这些资料的时候，发现了一个大问题。按照 Datasheet 资料上<br />
的描述，我们却完全读取不到正确的内存信息，后来发现，内存控制寄存器 MCHBAR 被锁住<br />
了（disabled置高），用程序也无法解锁。这里好像僵住了。<br />
<br />
在 Datasheet 中，唯一可以看到的就是 &quot;Locked by Intel TXT mode&quot;。这是 Intel 新出<br />
的一中加密技术。相当长的时间里，我也无法找到加密的方法。<br />
<br />
事情就这样过去了，在过一段时间。公司立刻也拿到了 Intel 3 系列的主板 G33，我们对<br />
这块板子仍旧担心受怕。如果 Intel 仍旧将信息加密，我们无疑在这方面又会止步。恩，<br />
G33 一样采用了 965 的组织结构，将内存信息同一管理，还继续往下分类为两个通道（for<br />
DDR）。我们尝试用 945 的老方法读取 PCI 信息。恩？？完全奏效，Intel 发了善心，并<br />
没有封锁这段寄存器。我和同事兴高采烈的在 G33 Datasheet 中找取时序信息的描述。OMG，<br />
我觉得 Intel 实在太不厚道了，他隐藏了非常多的资料。寄存器组中的数据很多都是<br />
Reserved 状态，我们要的 CL 和 tRAS 就在其中！！！<br />
<br />
寄存器有很多很多个，他们定义的空间非常大，MCHBAR 指向的空间就有 4Kb，CL 是极其重<br />
要的参数，一旦变动会影响很多的参数，对其定位异常困难。这是另外一个僵局呢。<br />
<br />
我使用过很多很多的软件，在很多网站上发帖请求帮助，通常总是无功而返，偶尔有人告诉<br />
我，可以到 CPU-Z 官方论坛上。我想想也是，来看看 CPU-Z 是怎么样的呢？我使用<br />
CPU-Z 作了很多实验，发现它也不能在 965 芯片下提供实时的时序参数。哈哈，你也没辙<br />
了。但是在 G33 下面，CPU-Z 丝毫没有问题，我当时愣是无法明白。这资料是怎么找到的<br />
呢？<br />
<br />
后来我在 x86-secret 论坛上面遇到了一位朋友，我跟他说我在 G33 上遇到了些问题。他<br />
当时就很兴奋：没有想到也有人作着同样的事情。而此时此刻他也碰到了同样的难题，他的<br />
做法是选择向 Intel 官方寻求帮助。我地心来，这不是与虎谋皮么，他隐藏的资料，能告<br />
诉你们？但是他却告诉我，他已经得到了官方的许诺，说是在两个工作日内给予回复。我只<br />
有和这位老兄一起等待。<br />
<br />
&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;<br />
<br />
几乎一个星期过去了，我终于等到这位仁兄的回复。他告诉我，Intel 的硬件设计师已经考<br />
察了这个问题，他们回复说，这个问题是可以解决的，但是你必须和 Intel 签署一份 NDA<br />
协议（Single-user Non-Disclosure Agreement），并且向其提供一份官方认证的发布名单，<br />
保证我们遵守协议。<br />
<br />
因此我们放弃了这个念头，基于此下两个原因：<br />
1. 所谓官方认证的发布名单，必然是不会公开源代码的。<br />
2. 即便我们想法设法签署到了 NDA 协议，我们也拿到了内存控制器的资料，我们也是不被<br />
允许开放源代码的，否则我们就违反了 NDA 协议。<br />
<br />
哎，搞了半天，Intel 可是在这里等着我们呢。<br />
</font>
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/148964#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Dec 2007 20:25:48 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/148964</link>
        <guid>http://wfp.group.javaeye.com/group/blog/148964</guid>
      </item>
      <item>
        <title>在Drscheme使用stream的问题</title>
        <author>simohayha</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simohayha.javaeye.com">simohayha</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/131539" style="color:red;">http://wfp.group.javaeye.com/group/blog/131539</a>&nbsp;
          发表时间: 2007年10月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这几天的sicp第三章快结束了，可是stream这边，我始终无法在drscheme中使用，因此在google大神的帮助下，找到了解决方法;<br /><br />原文在这里：<br />http://schemewiki.org/view/Cookbook/MiscSICP<br /><br />要在drscheme中使用stream，必须在代码中加入下面这部分：<br /><pre name="code" class="java">(require (lib "defmacro.ss"))

; cons-stream : obj stream ->  stream
;   construct a stream whose first element is obj and whose tail is stream
;   [cons-stream is a special form]
(define-macro cons-stream
  (lambda (car cdr)
    `(cons ,car (delay ,cdr))))</pre><br /><br />为什么要用define-macro不是很懂，我直接用define的话下面使用cons-stream构造无限流时就会报错,忘达人解释一下.<br /><br />PS:知道原因了，哈哈 原来是：<br /><br /><div class="quote_title">引用</div><div class="quote_div">定义宏可以自定义新的语法结构， 主要是可以防止求值<br /></div><br />也就是 惰性求值..
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/131539#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 12 Oct 2007 21:26:01 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/131539</link>
        <guid>http://wfp.group.javaeye.com/group/blog/131539</guid>
      </item>
      <item>
        <title>KISS</title>
        <author>SilenceCliff</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://silencecliff.javaeye.com">SilenceCliff</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/130128" style="color:red;">http://wfp.group.javaeye.com/group/blog/130128</a>&nbsp;
          发表时间: 2007年10月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; 打开</span><span lang="EN-US">Word</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已经许久，本想写篇过了保险代理人考试，公司人事变动方面感怀的文字。但那种情绪与思绪是那么难以捕捉与整理，面对屏幕良久，作罢。</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上午从总部拿回最新这期的《程序员》。信手翻翻&mdash;&mdash;就像数钞票那样，再看了看目录，</span><span lang="EN-US">SaaS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就跟</span><span lang="EN-US">$</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一样充斥在各个角落。内心顿生强烈的反感。再看看封二的广告：</span><span lang="EN-US">2007</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">软件开发</span><span lang="EN-US">2.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大会，特别是下面标榜的四大主题：</span><span lang="EN-US">web2.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、企业开发</span><span lang="EN-US">2.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、系统开发</span><span lang="EN-US">2.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、语言工具</span><span lang="EN-US">2.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。看得我更是一头雾水，啼笑皆非。</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不是要&ldquo;炮轰司令部&rdquo;，不是想哗众取宠。只是想看看我们这个行业到底怎么了？</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">刚才还和同事讲了一个比喻：我们这个行业里炒作的这些</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务、服务组件、</span><span lang="EN-US">BEPL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">SaaS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&hellip;&hellip;它们就像股市、楼市里面的泡沫。铺天盖地的宣传都鼓吹它们怎么个好、怎么个划时代。就好像股市里有人大肆吹嘘发现了神仙股，让大家都去买都去赚大钱。姑且不论这&ldquo;神仙股&rdquo;的真实性，但即便大家赚钱，可通货膨胀也会使你的购买力原地踏步，因为你并没有领先。上帝&mdash;&mdash;如果真有的话&mdash;&mdash;是不会垂青那些&ldquo;没有脑子&rdquo;的人的。要有自己的&ldquo;价值投资&rdquo;策略，才可能成为格雷厄姆、成为沃伦&middot;巴菲特。</span><span lang="EN-US">Multis</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不可一世时，</span><span lang="EN-US">UNIX</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只是</span><span lang="EN-US">Ken Tompson</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的个人玩具；</span><span lang="EN-US">UNIX</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如日中天时，微软在传统的漠视与狂热的夹缝下掘地而起；</span><span lang="EN-US">IBM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">层次数据库大兴其道，赚得盆满钵满的时候，</span><span lang="EN-US">Oracle</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">拨开迷雾挑起关系数据库之大旗&hellip;&hellip;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">独辟蹊径，后来居上的例子比比皆是。&ldquo;机会不可均沾&rdquo;&mdash;&mdash;或者换个说法（但也可能更不好听），叫做&ldquo;群众永远是错的&rdquo;&mdash;&mdash;这个被保罗&middot;</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">萨谬尔逊纳入经济学三大原理的法则，或许正好能够印证这些例子。别人兜售的，时下如火如荼流行的，它们真是&ldquo;神仙股&rdquo;吗？作为一个投资者（相比金钱，时间其实更稀缺），我们应该慎重。</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但这些&ldquo;泡沫&rdquo;，它们真是泡沫吗？还是笔者浅薄的偏见？它们从何而来？它们会消亡吗？第一个问题见仁见智，开篇我以表明了我的观点。第二个问题依然见仁见智，客观标准是难以真正客观的。就第三个问题，我到着实是想浓墨重彩的好生渲染诟病一番。&ldquo;它们从何而来&rdquo;&mdash;&mdash;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看看那些曾经的泡沫&mdash;&mdash;死了一个</span><span lang="EN-US">CORBA</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可以再有一个</span><span lang="EN-US">EJB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">Without EJB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了我们可以有</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务，可以有</span><span lang="EN-US">SOA</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可以有</span><span lang="EN-US">ESB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&hellip;&hellip;莫不感叹其舆论之顽强啊。还记得</span><span lang="EN-US">Rod Johnson</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在谈到远程服务技术（</span><span lang="EN-US">Hession</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Burlap</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）时曾坦言&ldquo;标准化抑制创新&rdquo;。事实也正是如此，&ldquo;标准化&rdquo;让人们或主动或被动的得接受它。而&ldquo;标准化&rdquo;是谁在制定呢？是大厂商，实现标准的相应软件工具是谁在做，谁在买，谁在赚大钱呢？是大厂商。问题的根子就在这里。立法与司法兼于一人，没了三权分离，那么公平、民主、创新又从何谈起。这个类比是牵强，但核心之所在即大厂商缺乏技术层面的监督。它们就好比那些金融寡头肆意创造基于垃圾债券的金融衍生产品。不同的是，无限的金融衍生产品可以卷住大量货币，使其游离于实物商品市场之外，达到控制通货膨胀，掩人耳目于货币大量增发之事实。而技术行业（这个以复杂性为生的行业）的泡沫，圈走的除了企业的金钱财富，还有一代程序员宝贵的时间财富。</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现下，这个行业是个完全没有&ldquo;管制&rdquo;的市场，但，它并不竞争完全，它的前行只能依靠亚当&middot;斯密那&ldquo;看不见的手&rdquo;。没有有力的调控，我们将不得不经历一次又一次的泡沫破碎。因而&ldquo;泡沫&rdquo;永远不会消亡。</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但，我们不必过于灰心绝望。美国资本史上长达</span><span lang="EN-US">100</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多年没有中央银行，但它也依然能历久弥新。即便是</span><span lang="EN-US">1837</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后历史上最严重的萧条，但也能在</span><span lang="EN-US">1848</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">发现加州的黄金后经济焕然一新。在我们这个研究复杂性的行业，也依然可见那石上清泉&mdash;&mdash;</span><span lang="EN-US">UNIX</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">MS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Oracle DB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Google</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Lisp</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Scheme</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">FP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Smalltalk</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Kent Beck</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Erlang</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Hashkell</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">SICP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">TAOCP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">MMM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&hellip;&hellip;</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&mdash;&mdash;</span><span lang="EN-US">KISS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">！</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">世界本已纷繁复杂，我们应用有限的青春岁月去破除梳理这个世界，而不是去创造复杂坑害于世。像爱因斯坦一个执拗的活着：&ldquo;简单，但不要太简单&rdquo;。</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/130128#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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/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>Tue, 09 Oct 2007 15:28:45 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/130128</link>
        <guid>http://wfp.group.javaeye.com/group/blog/130128</guid>
      </item>
      <item>
        <title>消息传递：从风格到机制</title>
        <author>Lich_Ray</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lichray.javaeye.com">Lich_Ray</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/113907" style="color:red;">http://wfp.group.javaeye.com/group/blog/113907</a>&nbsp;
          发表时间: 2007年08月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">这是最终确定的 JavaScript 基于消息传递编程风格的文章“OOP 诡异教程（上）”的下篇，它的 Python 改写版本就是 <a href="http://lichray.javaeye.com/topic/88435" target="_blank">尝试用Python实现消息传递编程风格</a>。原文地址：(豆瓣：<a href="http://www.douban.com/group/topic/1669427/" target="_blank">http://www.douban.com/group/topic/1669427/</a> 博客：<a href="http://let-in.blogspot.com/2007/06/oop.html" target="_blank">http://let-in.blogspot.com/2007/06/oop.html</a>)。原来的想法是以风格开头，谈到 JavaScript 的内部机制，但作者 lichray 迟迟没有动键盘，认为不如利用已有的风格做一套机制出来，这样可能更有意义。于是，就有了这个更加“诡异”的下篇，展示了一个更加“诡异”的招数。<br /></div><br /><br /><div class="quote_title">引用</div><div class="quote_div">这篇文章的宗旨是利用我们仅有的“宾谓”语法构造出完整的一套面向对象机制，所以更多代码在更多的时候是不应在实际工作中使用的（也算一种元语言抽象），所以类似效率、代码风格之类的问题反对回帖质疑。</div><br /><br /><strong><span style="font-size: 12pt">四. 扩展的实现</span></strong><br /><a href="http://www.javaeye.com/topic/88435" target="_blank">上篇</a>最后给出了一个“看上去很美”的基于消息传递的编程风格，比如构造一个 People 类的代码类似：<br /><pre name="code" class="javascript">
function People () {
	var money = 0
	function setMoney (dollars) {
		money = dollars
	}
	function pay (dollars) {
		money -= dollars
	}
	return (function (verb) {
		return eval(verb)
	})
}
</pre><br />有了这样的语法我们就可以描述不少句子了。但是存在一个问题：现实中的 Objects 之间是存在关系的——比如，forrest 是个 IQ 为 75 的傻子，傻子是 People 的一种。而我们仅仅是生搬硬套了一种语法而割裂了这种 "is-a" 关系。现在我们的工作，目的之一就是让这样一个“真切”的世界从我们已有的编程风格的地基上拔地而起。<br />到底应该怎样做才能使 Fool 产生的对象都能响应 People 的消息呢？我们要给 Fool 产生的对象（也就是返回的那个匿名函数啦）都添加这样一种能力：如果在 Fool 中响应不了消息，那就反馈给 People 响应。<br /><pre name="code" class="javascript">
function Fool (iq) {
	var IQ = iq || 0
	function init (iq) {
		IQ = iq
	}
	return (function (verb) {
		try {
			return eval(verb)
		} catch (e) {
			return People()(verb)
		}
	})
}
</pre><br />js> forrest = Fool()<br />js> forrest('init')(75)<br />js> forrest('IQ')<br />75<br />js> forrest('money')<br />0<br /><br /><strong><span style="font-size: 12pt">五. 语法扩展和代码生成</span></strong><br />这下代码量增加了很多，强迫潜在的使用者们在创建每个类时都这样写那实在是令人抓狂。本来这篇文章应该不提此类问题的解决，但考虑到有益于读者理解“机制”这个抽象概念，这里给出一个可行的方案——把普通的类代码用 Function() 函数重编译为可用的 JavaScript 函数。也就是说，我们能给出类扩展的代码并指定被扩展的类来获取类似上文的代码：<br /><pre name="code" class="javascript">
Fool = extend('People()', function (iq){
	var IQ = iq || 0
	function init (iq) {
		IQ = iq
	}
})
</pre><br />为了方便字符串操作，我们希望编译后的代码的参数部分（如 People()）都集中出现在一个位置且尽可能便于定位。在函数头添加一句<br /><pre name="code" class="javascript">
var origin = People()
</pre><br />当然是可行的，这样还能使 Fool 内部显式引用到其超类。但这样还不够漂亮。我们修改编译后的样例代码为：<br /><pre name="code" class="javascript">
function () {
	return (function (origin) {
		var IQ = 0
		function init (iq) {
			IQ = iq
		}
		return (function (verb) {
			try {
				return eval(verb)
			} catch (e) {
				return origin(verb)
			}
		})
	})(People())
}
</pre><br />这个利用参数传递变量的小技巧不值得学习，实际效率不高。但在这篇文章中，这样绑定特殊变量的技术是标准方案。<br />那么，我们的语法扩展兼代码生成函数 extend() 的实现为：<br /><pre name="code" class="javascript">
function extend (originc, code) {
	function argsArea (code) {
		// 题外话，正则表达式也有不值得一用的时候
		return code.slice(code.indexOf('(')+1, code.indexOf(')'))
	}
	function bodyCode (code) {
		// 不用 trim() 了，别没事儿找事儿
		return code.slice(code.indexOf('{')+1, code.lastIndexOf('}'))
	}
	function format (body) {
		var objc = bodyCode(function () {
			return (function (verb) {
				try {
					return eval(verb)
				} catch (e) {
					return origin(verb)
				}
			})
		}.toString())
		return 'return (function (origin) {'+body+objc+'})('+originc+')'
	}
	var $ = code.toString()
	return Function(argsArea($), format(bodyCode($)))
}
</pre><br />这样前文提到过的 extend 的实例代码就可以正常运行了，测试代码不再重复。<br /><br /><strong><span style="font-size: 12pt">六. 机制完备化</span></strong><br />这样，我们的基于消息传递编程风格的一套面向对象机制就确定下来了。机制是宪法，是语言的根本大法，有了它，我们就可以通过修改代码生成器，很快地给这套机制进行完备化。<br />想法有很多，例子只举两个。<br />第一个例子：类的定义中应该能直接引用到将产生的对象 self。答案只有一句话：把返回的那个作为对象的匿名函数命名为 self。<br />第二个例子：既然是单继承模式，应当存在一个顶层类 AbsObj，使没有指定继承的类自动继承它。答案是：在 extend 函数体第一行添加代码：<br /><pre name="code" class="javascript">
if (arguments.length == 1) {
	code = originc
	originc = 'AbsObj()'
}
</pre><br />然后手工构造设计 AbsObj 类，为空也无所谓。不过当然了，一般都会给顶层类添加一些全局性质的消息绑定。由于是“底层操作”，基本上都需要修改 extend 函数。做了一个简单的：<br /><pre name="code" class="javascript">
function AbsObj () {
	//检测是否能响应此 verb，要再用一次异常处理
	function canHandle(verb){
		try {
			// 别担心这里的 self 会传递不过去
			self(verb)
		} catch (e) {
			return false
		}
		return true
	}
	function toString() {} // 这个搞起来其实很麻烦~`
	var self = function (verb) {
		return eval(verb)
	}
	return self
}
</pre><br /><br />js> Obj=extend(function(){x=5})<br />js> o=Obj()<br />js> o('canHandle')('x')<br />true<br />js> o('canHandle')('y')<br />false<br /><br />文章写完了，小结一下。消息传递的编程不仅仅是一种代码风格，还可以成长为一种完备的机制。这种完备性远不只是这两篇加起来不到300行的文章所能覆盖的（例如非常彻底的“万物皆对象”，因为只要是能响应消息的函数，连接一下 AbsObj 就是合法对象了；类，函数都可以），大家可以试着玩一玩，顺便体会一下这个计算模型的透明和强大。<br />另外，熟悉函数式编程的朋友可以帮忙思考一下：这样一个基于闭包变换的计算模型实质上是函数式的，再配合动态的函数式的对象级继承（用一个匿名类代换一下）就能在纯 FP 真正下实现 OOP 了。可惜的是每一次更新操作都要重新生成对象，性能代价大了点，yet another question.
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/113907#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Sat, 18 Aug 2007 20:10:17 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/113907</link>
        <guid>http://wfp.group.javaeye.com/group/blog/113907</guid>
      </item>
      <item>
        <title>Scala 用函数式编程的方法调用db4o</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/110998" style="color:red;">http://wfp.group.javaeye.com/group/blog/110998</a>&nbsp;
          发表时间: 2007年08月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>db4o 是一个开源的纯面向对象数据库，同时支持Java和dotNet。使用db4o可以用更加面向对象的方式存储数据，比JPA等通过ORM来协调数据库和对象之间的方案来的更为自然。</p>
<p>那么用函数式编程的眼光来看，应该如何使用db4o这样的库呢？首先我们来看一个db4o的包装类</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span>package&nbsp;plan.util; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;com.db4o.query.Query &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>abstract&nbsp;class&nbsp;LazyQuery[QInterface,&nbsp;T]&nbsp; (val&nbsp;criteria:&nbsp;List[</span><span class="attribute">Query</span><span>=</span><span class="tag">&gt;</span><span>Query])&nbsp;extends&nbsp;Iterable[T]&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;</span><span class="attribute">elements</span><span>&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;init:&nbsp;</span><span class="attribute">Query</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">null</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp; // 等价于 criteria leftFold init (&nbsp;query=&gt;query(query=&gt;query) )</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">query</span><span>&nbsp;=&nbsp;(criteria&nbsp;:\&nbsp;init)((f,&nbsp;q)=</span><span class="tag">&gt;</span><span>f(q)) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Db4oUtil.iterate[T](query) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;factory:&nbsp;List[</span><span class="attribute">Query</span><span>=</span><span class="tag">&gt;</span><span>Query]=</span><span class="tag">&gt;</span><span>QInterface &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;constrain(c:&nbsp;</span><span class="attribute">Query</span><span>=</span><span class="tag">&gt;</span><span>Query)&nbsp;=&nbsp;factory(c&nbsp;::&nbsp;criteria) &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>object&nbsp;Db4oUtil&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;iterate[T](q:&nbsp;Query)&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">set</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">q</span><span>.execute() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Iterator[T]&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;</span><span class="attribute">hasNext</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">set</span><span>.hasNext &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;</span><span class="attribute">next</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">set</span><span>.next.asInstanceOf[T] &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>看一个实际的例子，People和AutoInfo是POJO，People有一个指向AutoInfo的List。通过继承LazyQuery的Peoples可以很容易做一些查询、filter、以及复杂的操作。由于是functional的（所有的constrain都是query=&gt;query的函数），所以各个查询条件可以互相组合，非常方便</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span>package&nbsp;plan; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;plan.util.Db4oUtil &nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;plan.util.LazyQuery &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;com.db4o.Db4o &nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;com.db4o.ObjectContainer &nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;com.db4o.query.Query &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;scala.reflect.BeanProperty &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>class&nbsp;People&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;id:&nbsp;</span><span class="attribute">int</span><span>&nbsp;=</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;var&nbsp;name:&nbsp;</span><span class="attribute">String</span><span>&nbsp;=</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;address:&nbsp;</span><span class="attribute">String</span><span>&nbsp;=</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;var&nbsp;autoInfoList:&nbsp;</span><span class="attribute">java.util.List</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;java.util.ArrayList &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;addAutoInfo(autoInfo:&nbsp;AutoInfo)&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;autoInfoList.add(autoInfo) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;</span><span class="attribute">autoCount</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">autoInfoList</span><span>&nbsp;size &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>class&nbsp;AutoInfo&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;id:&nbsp;</span><span class="attribute">int</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">_</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;var&nbsp;name:&nbsp;</span><span class="attribute">String</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">_</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;@BeanProperty &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;owner:&nbsp;</span><span class="attribute">People</span><span>&nbsp;&nbsp;=&nbsp;</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>class&nbsp;Peoples(criteria:&nbsp;List[</span><span class="attribute">Query</span><span>=</span><span class="tag">&gt;</span><span>Query])&nbsp;extends&nbsp;LazyQuery[Peoples,&nbsp;People](criteria)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;override&nbsp;def&nbsp;</span><span class="attribute">factory</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;Peoples(_) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;withAuto()&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;constrain&nbsp;{&nbsp;</span><span class="attribute">q</span><span>=</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.descend(&quot;autoInfoList&quot;) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;def&nbsp;</span><span class="attribute">totalAuto</span><span>&nbsp;=&nbsp;(this.map(_.autoCount)&nbsp;:\&nbsp;0)(&nbsp;(f,g)&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;f&nbsp;+&nbsp;g&nbsp;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>object&nbsp;Db4oTest&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;var&nbsp;db:&nbsp;</span><span class="attribute">ObjectContainer</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">_</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;initData()&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">peo</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;People &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">peo.address</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;北京&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">peo.name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;Chris&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span class="attribute">auInfo</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;AutoInfo &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">auInfo.name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;雪铁龙&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">auInfo.owner</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">peo</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;peo.addAutoInfo(auInfo)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;db.set(peo) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">peo1</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;People &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">peo1.address</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;上海&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">peo1.name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;Louis&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;db.set(peo1) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;private&nbsp;def&nbsp;query(klass:&nbsp;Class)&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">q</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">db</span><span>.query() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;q.constrain(klass) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;q &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;def&nbsp;main(args:&nbsp;Array[String])&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">db</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">Db4o</span><span>.openFile(&quot;auto.yap&quot;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//initData&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span class="attribute">peoples</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;Peoples(List(</span><span class="attribute">q</span><span>=</span><span class="tag">&gt;</span><span>query(classOf[People]))) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;get&nbsp;total&nbsp;car&nbsp;all&nbsp;people&nbsp;have &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;peoples.totalAuto&nbsp;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;lazy&nbsp;query&nbsp;all&nbsp;people &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(peo&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">-</span><span>&nbsp;peoples.elements)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;peo.name&nbsp;)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;lazy&nbsp;query&nbsp;all&nbsp;people&nbsp;with&nbsp;autoinfo &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(peo&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">-</span><span>&nbsp;peoples.withAuto.elements)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;peo.name&nbsp;)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}finally{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.close(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/110998#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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/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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Aug 2007 22:53:08 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/110998</link>
        <guid>http://wfp.group.javaeye.com/group/blog/110998</guid>
      </item>
      <item>
        <title>读《ACM演讲集》有感</title>
        <author>Lich_Ray</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lichray.javaeye.com">Lich_Ray</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/110626" style="color:red;">http://wfp.group.javaeye.com/group/blog/110626</a>&nbsp;
          发表时间: 2007年08月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">上个学期末学校开展“读书月”活动，然后我冒“天下”之大不讳写了这篇文章，现转发在此。</div><br /><br /><span style="font-size: 12pt"><br />最近我在读一本似乎和编程没太大关系的计算机书籍，叫《ACM图灵奖演讲集 - 前20年》（以下简称《ACM演讲集》）。这本书收录了1966-1985年这20年间图灵奖获奖者们的演讲。相对于计算机的普及速度，文章已经很古老了，中文版出版也很久了，但并不像那些纷扰而嘈杂的电脑书刊那样稍纵即逝。普通的电脑书，充斥着看似先进的技术；普通的编程书，充斥着不知为什么而生的代码。而它，就像一位智者，静坐在书店那些已经满是垃圾文字的书架上，看着“畅销书排行榜”上的风云变幻，嘴角一丝不易察觉的坏笑。<br /><br />“看一本好书，就是在和许多伟大的灵魂对话”。如果《ACM演讲集》仅仅保存着一位作者的灵魂，不可能被我如此看重。事实上，它收录了23位获奖者的22篇文章。代码寥寥无几，甚至是作为反面教材的多于实例；除了一两篇纯属学术论文的文章，余者也没有复杂的数学推导。然而就是这样一本似乎只是在空谈的书，让我了解到了计算机科学发展的黄金时代的情况和“上古”的计算机前辈科学家们的不朽的思想与伟大的探索。约翰·巴克斯（BNF范式设计者、Algol语言发明人），唐纳德·E·克努特（《计算机编程艺术》作者、Tex系统设计者），约翰·麦卡锡（人工智能先驱，Lisp语言发明人），看着这些熟悉的名字，阅读着他们充满智慧和神性的演讲稿，研究前辈们思想的结晶，真是乐事。<br /><br />我对当代计算机的发展（尤其是国内）失望久矣：教育者们误人子弟，学生们急功近利，程序员们心浮气躁，整个国内软件业不成体统。步入计算机科学的殿堂后，我头脑中一直盘旋着许多疑惑——计算机科学是怎样发展的？科学家们都是怎样探索的？我应该如何学习？《ACM演讲集》给了我答案。其中每一篇文章都在总结前人努力的基础上打开崭新的视界，向我展示了前辈们创世纪般的工作。事实上，80年代之后，商业的发展严重阻碍了计算机科学的发展以及编程语言的进步，半个世纪前的文章仍然有着重要意义，人们仍然可以窥见大师们惊人的高瞻远瞩。<br /><br />《算法系统的综合（1966）》展示了第一位图灵奖获得者阿兰·伯利斯对当时编程语言及算法的理解，现在的系统少有出其右者；《程序的函数风格及其代数（1978）》展示了巴克斯设计的形式化函数式编程系统（FFPS），其严谨的函数式编程的数学定义令人叹为观止，他的思想至今只有极少数语言能够超越；《人工智能的一般性（1971）》中，麦卡锡对当时已有的Prolog逻辑式编程语言进行了分析并给出了在机械化推理方面的新思路；《关系数据库：生产力的实用基础（1981）》一文总算让大家有种“找到组织了”的感觉，然而一看文章才知道我们从不离手的关系型数据库理论是那样复杂，实现是那样困难，耗尽了一代科学家的心血。<br /><br />然而将这些伟大的努力投入实际应用的人们交还给前辈们什么了呢？商业化的、根本无法与其它产品协作的系统，然而它们独霸市场甚至早就了产业链；用来招揽更多用户的垃圾编程语言，然而它们渗入各层次计算机教育甚至是国家级项目。市场是产生了，教育却落后了，各式各样的流行文化你方唱罢我登场，有什么用？难道这些人不需要科学的进步了吗？看看现在那些公司和个人在汹涌而来的多处理器构架和分布式计算问题前的手足无措状就知道他们的可笑和可悲了。<br /><br />说这些又有什么用？没有用，不说了。我学我的，他搞他的，不相干。<br /><br />最新的《ACM演讲集》应该不久就能引进了吧？多希望能看到我的偶像Alan Kay在2003年获得图灵奖时的演讲啊！顺便提一句，他的Smalltalk语言及其系统自1972年实现以来已经30多年没见过真正的对手了，不过，想在未来10年之类被某个对手超越仍然几乎是不可能的。<br /></span>
          <br/>
          <span style="color:red;">
            <a href="http://wfp.group.javaeye.com/group/blog/110626#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 09 Aug 2007 22:33:10 +0800</pubDate>
        <link>http://wfp.group.javaeye.com/group/blog/110626</link>
        <guid>http://wfp.group.javaeye.com/group/blog/110626</guid>
      </item>
      <item>
        <title>在scala里调用Hibernate JPA</title>
        <author>fakechris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fakechris.javaeye.com">fakechris</a>&nbsp;
          链接：<a href="http://wfp.group.javaeye.com/group/blog/108302" style="color:red;">http://wfp.group.javaeye.com/group/blog/108302</a>&nbsp;
          发表时间: 2007年08月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>虽然scala里也能直接使用hibernate逆向工程生成的entity文件，但是使用scala可以大大减少代码量。</p>
<p>pojo在java中的定义如下</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="annotation">@Entity</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="annotation">@Table</span><span>(name&nbsp;=&nbsp;</span><span class="string">&quot;mytable&quot;</span><span>,&nbsp;catalog&nbsp;=&nbsp;</span><span class="string">&quot;mydb&quot;</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MyTable&nbsp;</span><span class="keyword">implements</span><span>&nbsp;java.io.Serializable&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;title; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;summary; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Date&nbsp;date; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;tags; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;MyTable&nbsp;()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;MyTable&nbsp;(</span><span class="keyword">int</span><span>&nbsp;id,&nbsp;String&nbsp;title,&nbsp;Date&nbsp;date)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.title&nbsp;=&nbsp;title; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;MyTable&nbsp;(</span><span class="keyword">int</span><span>&nbsp;id,&nbsp;String&nbsp;title,&nbsp;String&nbsp;summary,&nbsp;Date&nbsp;date, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tags)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.title&nbsp;=&nbsp;title; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.summary&nbsp;=&nbsp;summary; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.date&nbsp;=&nbsp;date; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.tags&nbsp;=&nbsp;tags; &nbsp;&nbsp;</span> </li>
    <li