一、释名
为什么叫精神?
如果你熟悉c++,那么你可能知道一个叫做”spirit”的parser库。它利用c++的模板元编程能力,使用c++语言本身提供了一个递归下降文法解析的框架。
我这里介绍的jparsec库,就是一个java里面的递归下降文法解析框架。
不过,它并非是spirit的java版本。
jparsec的蓝本来自haskell语言的parsec库。parsec是一个基于monad的parser组合子库。
这个库的目的是要在java中提供一个类似parsec, spirit的库,这种组合子库并非c++的专利,java/c#也可以做到。这个库还将在java5.0上被改写,类型安全上它将也不再逊色于c++。
那么,为什么叫“函数式”呢?java是面向对象的嘛。
如果你使用过haskell, lisp等语言,这个函数式不用解释你也知道是怎么回事了。
如果你是一个老牌的c++/java程序员,那么这里还要稍微解释一下。当然如果您对这些虚头八脑的名词不感兴趣,那么,你尽可以跳过这一章,不知道什么是“函数式”,并不会影响你对这个库的理解的。
c++这几年随着gp的普及,“函数式”这个老孔乙己逐渐又被人从角落里面拽了出来。一个c++程序员所熟悉的“函数式”很可能是stl的for_each, transform,count_if这些函数。
怎么说呢,就象我不能否定str.length()这个调用属于oo一样,我也无法说for_each, transform不是函数式。
但是,“函数式”的精髓不在于此。
一般归纳起来,就像我们说oo是什么多态,封装,继承一样,“函数式”的特征被总结为:
1.无副作用。
2.高阶函数。
3.延迟计算
而最最有意义的(至少我认为如此),是基于高阶函数的函数组合能力。一些人把这叫做glue。
简短地说,什么让函数式编程如此强大?是用简单的函数组合出复杂函数的能力。
我可以想象,说到这里,你还是一头雾水。“什么是组合?1+1不是也把两个1组合成2了吗?new a(new b(), new c())不也是从b和c组合成a了?”
为了直观,我们来举个例子吧。
假设,我们在package predicates内部有一个接口:
interface spredicate{ |
我们有几个基本的实现:
class isempty implements spredicate{ |
这个实现判断字符串是不是空。
class iscaptialized implements spredicate{…} |
这个实现判断这个字符串是不是大写打头。
class islowercase implements spredicate{…} |
这个实现判断字符串是不是全小写。
class isequal implements spredicate{ |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器