Common Lisp编程初步---环境搭建和外部lisp代码运行

1 介绍

Lisp是世界上第二古老的语言,第一古老语言是Fortran。Lisp语言的创立者为John McCarthy,一位人工智能领域里的先驱。该语言自创立以来经历了50多年而不衰,是一种很有生命力的语言。该语言的发展和使用与CMU和MIT两所高校密不可分,在相当长的时期内是这两所高校的大学计算机课程指定语言。

在该语言创立之初,除了创建者外,还有其他的一些高校著名学者也参与到了Lisp语言的发展完善当中。于是就出现了多个Lisp的dialect,这对该语言的移植非常不便。为此在1981年丛多Lisp方面的专家和学者聚焦在一起,提出了Common Lisp (CL),意为“大家共同的Lisp语言”,旨在所有的Lisp使用者遵循共同的标准,并方便工业化应用。CL吸收了之前多个Lisp方言的优点,并添加了面向对象的功能,使得其成为了Lisp语言中使用最广泛的一种。从1981年ANSI吸收CL为标准来,1989年ANSI又更新了CL标准,这称为CL 1989,并保持对之前CL标准的兼容。对于标准中没有规定出来的,允许各编译器厂商自己的发挥。自此,CL进入了稳定的发展阶段,你会发现,在1980年代末的一些人工智能教材中的CL代码,现在仍然能够运行。

CL语言,包括Lisp的其他方言使用的不并广泛,但不能由此断定其是一种将要死亡的语言。事实上,CL是充满生机和活力的,当前也存在着利用CL搭建的大型项目。教材《人工智能:理论与实践》1是一本2003年版的影印版,其中的人工智能算法就是采用的CL语言; 著作2
《Common Lisp: A gentle Introduction to Symbolic Computation》 于2013年又出了新的更正后的电子版本。Lisp语言具有好多优良的特性,比如,Garbage Collection,动态类型,函数式编程等,现代的很多语言都在借鉴了lisp语言的一些特性,在这些方面,lisp为其他语言树立了典范。可以说,任何一个想追求卓越的程序员,都应该学习和使用一下Lisp语言。一旦你学会了该语言,你会发现其他语言对你来说变得那么的容易,这时,你已处于泰山之巅了。

另外一个现在仍在使用的一个Lisp方言为Scheme,教材《Structure and Interpretation of Computer Programs》3就是以该语言为基础讲解相关的算法。Scheme主要是一种教学型的,理论上很完美的语言,但工业化应用不足,在大型项目方面没CL应用广泛。

本文将讲解CL的环境搭建、IDE的使用、编写简单的交互程序、及将代码文件.lisp导入到IDE中并运行等方面的内容。

2 环境搭建

能够运行CL程序的环境有很多种,这里讲解一个Lispbox运行环境,你可以称它为IDE。Lispbox将emacs与cl的解释器整合在一起,从而成为一个CL的开发环境,启动以后它会自动导入一些包 (packages),方便编程人员编程。你可以从这里下载Lispbox,该网站提供了Windows、OS X、Linux三种不同操作系统下的Lispbox,你可以根据自己的需要,任选一个。

3 IDE Lispbox的使用

本文以Windows 7系统下为例讲解Lispbox的使用方法。下载后,你只要解压缩到你的文件夹下即可,不需要任何的安装过程。Lispbox是一个纯绿色的软件。

3.1 启动Lispbox

在主文件夹下,双击lispbox.bat即可启动。
这里写图片描述

3.2 更改当前默认directory

也许你的lisp源代码不在当前目录下,这就需要在Lispbox中更改当前工作目录。这种做法是很常见的,在其他的软件,例如Matlab,R等也要学会更改目录的方法。如果你会emacs编辑器的话,你自然就会,不用继续阅读本小节。

假如我先前编写的一个lisp程序add-title.lisp存放在Lispbox主目录的my-study-lisp文件夹下,那么改到my-study-lisp文件夹下的方法为:

  1. 在命令提示符cl-user>后输入逗号;
  2. 在底部输入cd;如下图:
    这里写图片描述
  3. 在cd后面输入回车,在出现的路径后面输入my-study-lisp,即完成我们的任务,成功后如下图:
    这里写图片描述

4 CL编程初步

在CL中有一个术语叫REPL (Read, Evaluate, Print, Loop),这相当于Python中的交互式编程,输入一个命令,立刻显示该命令执行后的结果,支持快速开发。

4.1 一个简单的交互式程序举例

CL的语言的语法比较简单,就是将一些内容写在()中,以前缀的方式写入。比如,如下图:
这里写图片描述
上程序是求2的平方根。

4.2 导入源文件.lisp程序到Lispbox中

我们不可能每次都在交互式下运行我们的程序,当我们的程序稳定后,自然要存入到一个文件中,这样不必每次都重新输入。这个文件的后缀,一般为lisp。接下来,我们讲解通过Lispbox怎样运行存放在lisp文件中的程序。

假如,我的源程序文件add-title.lisp的内容为 (取自《Common Lisp: A gentle Introduction to Symbolic Computation》4):

(defun titledp (name)
  (member (first name) '(mr ms miss mrs)))

(setf male-first-names
      '(john kim richard fred george))
(setf female-first-names
      '(jane mary wanda barbara kim))

(defun malep (name)
  (and (member name male-first-names)
       (not (member name female-first-names))))

(defun femalep (name)
  (and (member name female-first-names)
       (not (member name male-first-names))))

(defun give-title (name)
  "Returns a name with an appropriate title on the front."
  (cond ((titledp name) name)
    ((malep (first name)) (cons 'mr name))
    ((femalep (first name)) (cons 'ms name))
    (t (append '(mr or ms) name))))

我们采用如下命令在CL-USER后面输入(load "add-title.lisp")即可,如下图:
这里写图片描述
上图中导入后有一些警告信息,不用担心,它们并不影响后面程序的执行。下面我们将要使用add-title程序,如下:
这里写图片描述
程序会自动在名字的前面加上尊称,如果有尊称的话,则不再用添加,符合我们的预期。

5 结束语

CL是一种对程序员很有挑战的语言,要想学好它需下相当的功夫。但它非常好玩,且许多人工智能书籍的一些智能程序以CL为编程语言,所以,要想看懂这些书籍,实践书中的一些算法,就首先必须会用CL语言。当然,你也可以利用C++语言实现人工智能书中的算法,但是我认为最终的实现代码会比较啰嗦,没有CL的看起来直接和容易理解,更接近人们的思维。或者说C++实现的代码更接近计算机。


  1. (美)迪安 (Dean, T.)等著. 人工智能:理论与实践. 北京:电子工业出版社, 2003.
  2. David S. Touretzky. Common Lisp: A gentle Introduction to Symbolic Computation. Benjamin/Cummings Publishing Company, Inc, 1990.
  3. Harold Abelson, Gerald Jay Sussman, and Julie Sussman. Structure and Interpretation of Computer Programs. The MIT Press, Cambride, 1996.
  4. David S. Touretzky. Common Lisp: A gentle Introduction to Symbolic Computation. Benjamin/Cummings Publishing Company, Inc, 1990.
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值