• TechTalk by Peter Seibel on Common Lisp


    看了一个视频: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, 获得更强大的表达能力。

  • 相关阅读:
    typeof检测几种较为特殊的值与Boolean强制转换哪几种值为false Amy
    类型检测 Amy
    JS基本概念 Amy
    JS导入文件与CSS导入文件的不同 Amy
    JS运行环境 Amy
    主流浏览器及其渲染引擎 Amy
    JS引用类型 Amy
    同名函数的覆盖问题 Amy
    JS变量、作用域和内存问题 Amy
    HTTP协议学习(1)
  • 原文地址:https://www.cnblogs.com/RChen/p/2535172.html
Copyright © 2020-2023  润新知