Lisp.作为属性的函数

来源:互联网 发布:linux apt安装jdk1.8 编辑:程序博客网 时间:2024/05/05 09:09

函数是Lisp对象的事实允许我们写出在运行时被扩展的程序。假设我们想要写一个函数,这个函数接受动物的类型作为参数并做一些对应的操作。在大多数语言中,要做到这点就是用case语句,我们在Lisp中也可以这样做:

(defun behave (animal)
(case animal
(dog (wag-tail)
(bark))
(rat (scurry)
(squeak))
(cat (rub-legs)
(scratch-carpet))))

如果我们向要加入新的动物类型呢?如果我们计划加入新的动物,我们最好像下面这样定义behave:

(defun behave (animal)

(funcall (get animal 'behavior)))

并将动物各自的行为定义为一个函数,比如,对于他们名字的列表:

(setf (get 'dog ''behavior)

#'(lambda () (wag-tail)

(bark)))

这样,我们需要做的就是定义新的属性。没有函数需要被重写。


尽管第二种方式更加灵活,但是看上去有些慢。确实是有点慢。如果速度是非常重要的,我们还是使用结构体,特别的,使用编译,而不是解释函数。通过结构体和编译的函数,更加灵活的代码类型可以达到或者超过使用case的版本。


这样使用函数对应于面向对象编程的方法。通常的,一个方法就是一个对象的属性函数,那就是我们所做的。如果我们将继承加入到这个模型中,我们将获得面向对象编程的所有要素。25章将展示用非常少得代码就可以搞定这点。


面向对象语言最大的卖点之一就是使程序可扩展。这在Lisp世界里并不稀奇,可扩展性就是默认的。如果扩展不大量的依赖于继承,那么纯Lisp已经够了。

原创粉丝点击