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. ?
时间: 2024-08-05 07:05:02

Common Lisp编程初步---环境搭建和外部lisp代码运行的相关文章

hadoop初步环境搭建,ssh无密码通信

一.初步环境搭建 1在Windows 7上安装VMware虚拟机(VMware-workstation-full-9.0.2),VMware Workstation下载地址: https://my.vmware.com/cn/web/vmware/details?downloadGroup=WKST-902-WIN&productId=293&rPId=3526 注意:不要安装到C盘,找一个磁盘剩余空间较大的盘安装. 2在VMvare中装三台Ubuntu机器(我们使用的是ubuntu-14

Unix网络编程之环境搭建

环境搭建 在尝试UNP书上的例子时,会因为找不到"unp.h"等问题无法编译成功,因此在学习之前需要先搭建好编译环境. 步骤 <1>下载  UNIX网络编程源代码unpv13e.tar.gz 下载链接  http://download.csdn.net/detail/ymsdu2004/4906181 <2>解压 进入该目录后执行 ./configure 再进入lib目录下 cd lib       执行 make 此时会在上层目录(就是刚才有configure

JAVA初步——环境搭建和专业术语解释,helloworld程序编写小结

Java编程语言初体验 一.前言 相关专业术语简介 1.软件开发--即一系列按照指定顺序组织的计算机数据和指令的集.合.分为系统软件和应用软件. 2.人机交互方式:命令行(Linux系统).图形化界面(Windows) 3.常用的DOS命令:使用窗口键+r打开,输入cmd按回车/确定可以进入DOS界面 dir: 列出当前目录下的文件以及文件夹md: 创建目录rd: 删除目录cd: 进入指定目录cd.. 退回到上一级目录cd\: 退回到根目录del: 删除文件exit:退出dos命令行 4.计算机

《Unix NetWork Programming》(Unix网络编程)—环境搭建

1,安装编译器,为了齐全还是安装一下build-essential [python] view plaincopy sudo apt-get install build-essential 2,下载本书的头文件及示例源码 点此下载unpv13e.tar.gz  http://ishare.iask.sina.com.cn/f/13238521.html 3,解压unpv13e.tar.gz后进入目录查看README,然后可以按照里面提示操作,不过会遇到问题 第一步:在终端中进入upnv13e目录

UNIX环境高级编程学习环境搭建---apue.h

本菜刚刚学习UNIX下高级编程,无奈搭建本书编程环境时遇到不少问题.幸好网上有各种大神的解决办法让我最终解决了问题.在这里感谢为LINUX开源操作系统奋斗的大神. 不过话说回来,网上大都是针对UNIX高级编程第二版的头文件搭建,现在对于第三版来说,有些过时,因为很对针对linux的make文件已经改变了很多. 话不多说,下面就来看看具体的搭建过程:(本人用的操作系统是ubuntu 14.04LTS) 1.在网上下载书中源代码,点击打开链接 2.解压文件:tar -zxvf *.tar.gz 3.

《Unix环境高级编程》环境搭建

用的是第三版的安装包:src.3e.tar.gz 地址:http://www.apuebook.com/ 1.解压:$ tar  -zxvf  *.tar.gz 2. $ cd apue.3e/ 3.编译:$ make 这个过程中报错: undefined reference to `heapsort' 解决办法: ① 下载2个包: wget http://dl.fedoraproject.org/pub/epel/6/x86_64/libbsd-0.6.0-1.el6.x86_64.rpm w

(转) Java我的高效编程之环境搭建

前言:刚毕业, 工作之余写博客有利于提高技术,更是能帮助人,接下来会认认真真写好每一篇博客.希望大家多多支持.废话不多说,马上开始.这是一篇环境搭建的博客. jdk+eclipse+svn+maven+mysql+tomcat7.0+sublime安装包和jar插件 配置管理工具-SVN http://download.csdn.net/detail/u013142781/9355417  tomcatPluginV331 http://download.csdn.net/detail/u013

Linux下C++的编程——开发环境搭建与第一个程序

上一篇文章Linux下C++的编程--开偏介绍中我们已经介绍了GUN.GCC.G++等一些重要的概念,现在应该开始动手实践了! 开发工具的安装 环境 Distributions版本:CentOS 6.7 Linux内核片:2.6.32-573.3.1.el6.i686 一般Linux安装完之后默认就已经安装了GCC(GNU Compiler Collection),你可以查看一下gcc和g++的版本号检查gcc和g++是否已经安装. [luowf@luoweifu ~]$ gcc -v gcc

Karma测试环境搭建

Karma是一个JavaScript的测试运行器.Karma更是一个测试环境,使用Karma可以很方便的的运行测试,今天我们简单地介绍一karma测试环境的搭建和基本的测试,我已经写好了一套测试用例,有谁需要可以私信我. 官网如下:http://karma-runner.github.io/0.12/index.html 我们总是实现完feature后再编写测试用例,但是根据TDD的原则,开发的流程一般是这样, 1.编写测试(执行失败的case) 2.运行测试(执行失败) 3.编写代码(让cas