看了一个视频:http://video.google.com/videoplay?docid=448441135356213813
Peter Seibel (Pratical Common Lisp 的作者)做的关于 Common Lisp (CL) 的语言优势的一些介绍,比较有意思。
第一个例子中,首先他给出了 Java 中 Visitor 模式的一个典型的实现(C# 中也差不多),代码很多。而在 Lisp 中有了语言特性 generic method, 就能直接了当的解决这个问题,Visitor 模式在 Lisp 中就用不着了。
这里比较一针见血的就是他指出了其实 Visitor pattern 本质上是一种 double dispatch 机制。也就是说,如何遍历树节点,以及遍历不同种类的树节点,这是一种分派(dispatch)机制,同时,对于每种不同的节点,还可能存在多种访问方式,这又是另一个 level 的分派机制。也就是说,对于同一个树我们可以定义多种 Visitor, 用做不同的用途。比如负责打印树的内容的 Visitor, 或者负责解析并计算树节点含义的 Visitor, 等等。也就是说:
Java 中的类继承体系 是第一个 level 的 dispatch;
具体对于每种不同的类进行何种操作,又是第二个 level 的 dispatch.
CL 的优势在于:方法不属于类。
generic method (广义方法)可以针对其每一个实例参数的类型(以及其他特征)进行任意的特化!
这样来看,不光 double dispatch 了,其实可以实现任意的 multiple dispatch 机制。
相比而言,Java / C# 体系的单继承 OO 系统真的是太简单了。
有时候我们会发现在 Java / C# 中很难准确设计类之间的继承关系,其实跟语言的表达能力有限有直接的关系。
第二个重要的语言特征,讲到了 CL 中的 Condition System. 这个比一般语言里的 try..finally 异常处理的机制要强大很多。听其描述应该可以直接支持类似 AOP 这样的编程手段。不过我暂时还没有完全搞明白,这里先不说。
第三个就是介绍了宏,Lisp 的终极武器。其本质的强大性在于可以任意定义语法,参与编译器的编译步骤,从而方便的实现 DSL, 获得更强大的表达能力。