软讯网络 > 软件时空 > 软件相关 > OnLisp学习笔记-1 The Extensible Language
【标 题】:OnLisp学习笔记-1 The Extensible Language
【关键字】:
OnLisp,The,Extensible,Language
【来 源】:http://www.cublog.cn/u/4614/showart.php?id=92522
OnLisp学习笔记-1 The Extensible Language
大部分人把Lisp当成一种古老的人工智能语言,实际上Lisp与AI的联系只是因为古老的历史原因。Lisp是 John McCarthy发明的,同时这位老兄也发明了 Artificial Intelligence 这个术语(这还是我第一次知道这件事)。于是,于是AI就和Lisp挂上钩了,历史阿……
现在,Lisp存在于很多领域,最著名的 Emacs, AutoCAD,以及Interleaf,一个高端出版系统。
Lisp与其他语言的区别在于,Lisp就像橡皮泥一样可以随意捏,适应各种任务。Lisp本身就是一个Lisp程序,而Lisp程序又是一个List结构,用户可以自己添加语言特性~(又晕了,不说了)
1.1 Design by Evolution
由于Lisp赋予使用者设置自己的操作符的自由,总之就是要写什么样的软件,就可以把Lisp塑造成适合什么样软件的程序语言。(还是不大理解,这一点其他语言通过函数库似乎也可以做到,继续读下去)。大概就是写着写着,吧唧一下~Lisp就变成你需要的语言了:)
哈~今天总算读到我喜欢的东西了: The plan-and-implement method并不适合于写程序!◎!(真希望我的项目总监能读到这些)(如果真读到了,当我没说过)
毕竟,软件开发与传统的工程是有区别的,可变因素太多了,硬要使用传统的管理工程方法来指导软件开发,只能产生出呆板的代码和呆板的文档员。
先做详尽计划的一个原因是:缺少 Flexible 的工具。总是希望在开始的时候估计好任何的变化与可能,我们从来没有做到过,J2EE不能,软件工程不能,oh shit,连.net都不行。Lisp可以么?也不行。
不过我们可以变写边计划,预见3个月的情况很困难,但预见3天的情况还是可能的,如果我们用足够flexible的工具与方法,生活应该可以更简单些。边干边计划。
实际上,这很符合“敏捷开发”的思路,最好的文档和计划,就是呢写的代码~
多花时间在代码上,要比花时间在Word上强多了,不知道老板们为什么就不这么想。
1.2 Programming Bottom-Up
函数不能太大,太大了就会容易出错,阅读起来也困难。这是一条程序风格的共识。功能复杂就需要分解到适当的粒度上。
Top-down 的方法是比较通常的做法,而有经验的Lisp程序员用一种不同的方法:Bottom-up。在Lisp中,不单单是用Lisp程序来写特定的问题的程序,而是把Lisp构建成解决那个问题的语言。在写程序时,将会考虑,Lisp应该有什么样的操作符,什么样的函数,于是就写出来。语言与程序同时进化。写到最后,程序看上去就好像语言是专门为此设计的一样。
后面还讲了一大堆Bottom-up的好处,总之Lisp不仅仅是另一种编程语言,更是另一种编程方式。这也是它用户那么少的原因吧。
1.3 Extensible Software
说道可扩展的软件,现在我正在用PHP改写的一个社区程序,可以算做一例:边开发边使用。
用户需求不可能完全满足,所以软件应该可以扩展,让高级用户自己通过接口来扩展自己的功能,就像Autocad的二次开发。Bottom-up的开发方式可以很自然的实现拓展。
一些例子: Gnu Emacs, XWindow, TeX。Emacs大部分使用Lisp实现的,同样,很多Autocad二次开发的工具包也是Lisp写的,一些高级命令用Lisp来实现。
因为Lisp本身是可以扩展的,因此使用Lisp来做可扩展软件的开发,就可以给用户一个扩展了的Lisp语言(比如AutoLisp)。
当然,动态语言渐渐的开始流行起来,没有必要再过多的强调。
1.4 Extending Lisp
Function & Macros
Function例子:
(map1-n fn 10) 对1-n 每一个数调用fn
Macros are programs that write programs. 听上去很酷阿,还记得我们当初为什么学程序么?难道不是因为觉得程序员很酷么。
Macro这个东西不好理解在于其他语言中没有对等物,C++ Template 算不算,我不清楚。
Macro的例子:
(defmacro for ((var start stop) &body body)
(let ((gstop (gensym)))
‘(do ((,var ,start (1+ ,var))
(,gstop ,stop))
((> ,var ,gstop))
,@body)))
(for (x a,b)
(print x))
--- 对比:
(do ((x a (+ 1 x)))
((> x b))
(print x))
Lisp语言可以生成很多变种:Embedded language,CLOS就是一个。
1.5 Why Lisp (or When)
Lisp 具有的一些特性:动态存储分配和垃圾收集,runtime typing ,函数对象,内建list类型,一个内建的compiler,交互环境。(听起来有点像Python,确实Python有很多Lisp的特性)
Fortran和Lisp是现在还在用的最古老的两种高级语言,他们代表着两种相反的程序哲学:Fortran是从汇编演进的,Lisp是用来描述算法的。其他的语言大多在这两者之间。同时,这两种语言也在向中间靠近。
近些年的发展,已经越来越朝着有利于Lisp的方向发展,很多新进的语言吸收了Lisp的特性。还记得Java中的GC么,Lisp可是在60年代就有了。
现在的问题已经不是要不要Lisp,而是 When?
go on Lisp。。。。