LISP语言教程.docx
- 文档编号:3226803
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:31
- 大小:62.87KB
LISP语言教程.docx
《LISP语言教程.docx》由会员分享,可在线阅读,更多相关《LISP语言教程.docx(31页珍藏版)》请在冰豆网上搜索。
LISP语言教程
LISP语言教程
Scheme语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。
但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。
Scheme语言概要
Scheme语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。
但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。
作为Lisp变体,Scheme是一门非常简洁的计算语言,使用它的编程人员可以摆脱语言本身的复杂性,把注意力集中到更重要的问题上,从而使语言真正成为解决问题的工具。
本文分为上、下两部分来介绍scheme语言。
一.Scheme语言的特点
Scheme语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。
但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。
它是一个小巧而又强大的语言,作为一个多用途的编程语言,它可以作为脚本语言使用,也可以作为应用软件的扩展语言来使用,它具有元语言特性,还有很多独到的特色,以致于它被称为编程语言中的"皇后"。
下面是洪峰对Scheme语言的编程特色的归纳:
∙词法定界(LexicalScoping)
∙动态类型(DynamicTyping)
∙良好的可扩展性
∙尾递归(TailRecursive)
∙函数可以作为值返回
∙支持一流的计算连续
∙传值调用(passing-by-value)
∙算术运算相对独立
本文的目的是让有编程基础(那怕是一点点)的朋友能尽快的掌握Scheme语言的语法规则,如果您在读完本文后,发现自己已经会用Scheme语言了,那么我的目的就达到了。
二.Scheme语言的标准与实现
R5RS(Revised(5)ReportontheAlgorithmicLanguageScheme)
Scheme语言的语法规则的第5次修正稿,1998年制定,即Scheme语言的现行标准,目前大多数Scheme语言的实现都将达到或遵循此标准,并且几乎都加入了一些属于自己的扩展特色。
Guile(GNU'sextensionlanguage)
Guile是GNU工程的一个项目,它是GNU扩展语言库,它也是Scheme语言的一个具体实现;如果你将它作为一个库打包,可以把它链接到你的应用程序中去,使你的应用程序具有自己的脚本语言,这个脚本语言目前就是Scheme语言。
Guile可以在LINUX和一些UNIX系统上运行,下面是简单的安装过程:
下载guile-1.6.4版,文件名为guile-1.6.4.,执行下面的命令:
tarxvfzguile-1.6.4.
cdguile-1.6.4
./configure
make
makeinstall
如此,即可以执行命令guile,进入guile>提示符状态,输入调试Scheme程序代码了,本文的所有代码都是在guile下调试通过。
其它实现
除了Guile外,Scheme语言的实现还有很多,如:
GNU/MIT-Scheme,SCI,Scheme48,DrScheme等,它们大多是开源的,可以自由下载安装使用,并且跨平台的实现也很多。
你会发现既有象basic的Scheme语言解释器,也有将Scheme语言编译成C语言的编译器,也有象JAVA那样将Scheme语言代码编译成虚拟机代码的编译器。
三.基本概念
注释
Scheme语言中的注释是单行注释,以分号[;]开始一直到行尾结束,其中间的内容为注释,在程序运行时不做处理,如:
;thisisaschemecommentline.
标准的Scheme语言定义中没有多行注释,不过在它的实现中几乎都有。
在Guile中就有多行注释,以符号组合"#!
"开始,以相反的另一符号组合"!
#"结束,其中内容为注释,如:
#!
thereareschemecommentarea.
youcanwritemulitylineshere.
!
#
注意的是,符号组合"#!
"和"!
#"一定分做两行来写。
Scheme用做脚本语言
Scheme语言可以象sh,perl,python等语言那样作为一种脚本语言来使用,用它来编写可执行脚本,在Linux中如果通过Guile用Scheme语言写可执行脚本,它的第一行和第二行一般是类似下面的内容:
#!
/usr/local/bin/guile-s
!
#
这样的话代码在运行时会自动调用Guile来解释执行,标准的文件尾缀是".scm"。
块(form)
块(form)是Scheme语言中的最小程序单元,一个Scheme语言程序是由一个或多个form构成。
没有特殊说明的情况下form都由小括号括起来,形如:
(definex123)
(+12)
(*456)
(display"helloworld")
一个form也可以是一个表达式,一个变量定义,也可以是一个过程。
form嵌套
Scheme语言中允许form的嵌套,这使它可以轻松的实现复杂的表达式,同时也是一种非常有自己特色的表达式。
下图示意了嵌套的稍复杂一点的表达式的运算过程:
变量定义
可以用define来定义一个变量,形式如下:
(define变量名值)
如:
(definex123),定义一个变量x,其值为123。
更改变量的值
可以用set!
来改变变量的值,格式如下:
(set!
变量名值)
如:
(set!
x"hello"),将变量x的值改为"hello"。
Scheme语言是一种高级语言,和很多高级语言(如python,perl)一样,它的变量类型不是固定的,可以随时改变。
四.数据类型
1.简单数据类型
逻辑型(boolean)
最基本的数据类型,也是很多计算机语言中都支持的最简单的数据类型,只能取两个值:
#t,相当于其它计算机语言中的TRUE;#f,相当于其它计算机语言中的FALSE。
Scheme语言中的boolean类型只有一种操作:
not。
其意为取相反的值,即:
(not#f)=>#t
(not#t)=>#f
not的引用,与逻辑非运算操作类似
guile>(not1)
#f
guile>(not(list123))
#f
guile>(not'a)
#f
从上面的操作中可以看出来,只要not后面的参数不是逻辑型,其返回值均为#f。
数字型(number)
它又分为四种子类型:
整型(integer),有理数型(rational),实型(real),复数型(complex);它们又被统一称为数字类型(number)。
如:
复数型(complex)可以定义为(definec3+2i)实数型(real)可以定义为(definef22/7)有理数型(rational)可以定义为(definep3.1415)整数型(integer)可以定义为(definei123)
Scheme语言中,数字类型的数据还可以按照进制分类,即二进制,八进制,十进制和十六进制,在外观形式上它们分别以符号组合#b、#o、#d、#x来作为表示数字进制类型的前缀,其中表示十进制的#d可以省略不写,如:
二进制的#b1010,八进制的#o567,十进制的123或#d123,十六进制的#x1afc。
Scheme语言的这种严格按照数学定理来为数字类型进行分类的方法可以看出Scheme语言里面渗透着很深的数学思想,Scheme语言是由数学家们创造出来的,在这方面表现得也比较鲜明。
字符型(char)
Scheme语言中的字符型数据均以符号组合"#\"开始,表示单个字符,可以是字母、数字或"[!
$%&*+-./:
<=>?
@^_~]"等等其它字符,如:
#\A表示大写字母A,#\0表示字符0,其中特殊字符有:
#\space表示空格符和#\newline表示换行符。
符号型(symbol)
符号类型是Scheme语言中有多种用途的符号名称,它可以是单词,用括号括起来的多个单词,也可以是无意义的字母组合或符号组合,它在某种意义上可以理解为C中的枚举类型。
看下面的操作:
guile>(definea(quotexyz));定义变量a为符号类型,值为xyz
guile>a
xyz
guile>(definexyz'a);定义变量xyz为符号类型,值为a
guile>xyz
a
此处也说明单引号'与quote是等价的,并且更简单一些。
符号类型与字符串不同的是符号类型不能象字符串那样可以取得长度或改变其中某一成员字符的值,但二者之间可以互相转换。
2.复合数据类型
可以说复合数据类型是由基本的简单数据类型通过某种方式加以组合形成的数据类型,特点是可以容纳多种或多个单一的简单数据类型的数据,多数是基于某一种数学模型创建的。
字符串(string)由多个字符组成的数据类型,可以直接写成由双引号括起的内容,如:
"hello"。
下面是Guile中的字符串定义和相关操作:
guile>(definename"tomson")
guile>name
"tomson"
guile>(string-lengthname);取字符串的长度
6
guile>(string-set!
name0#\g);更改字符串首字母(第0个字符)为小写字母g(#\g)
guile>name
"gomson"
guile>(string-refname3);取得字符串左侧第3个字符(从0开始)
#\s
字符串还可以用下面的形式定义:
guile>(defineother(string#\h#\e#\l#\l#\o))
guile>other
"hello"
字符串中出现引号时用反斜线加引号代替,如:
"abc\"def"。
点对(pair)
我把它译成"点对",它是一种非常有趣的类型,也是一些其它类型的基础类型,它是由一个点和被它分隔开的两个所值组成的。
形如:
(1.2)或(a.b),注意的是点的两边有空格。
这是最简单的复合数据类型,同是它也是其它复合数据类型的基础类型,如列表类型(list)就是由它来实现的。
按照Scheme语言说明中的惯例,以下我们用符号组合"=>"来表示表达式的值。
它用cons来定义,如:
(cons89)=>(8.9)
其中在点前面的值被称为car,在点后面的值被称为cdr,car和cdr同时又成为取pair的这两个值的过程,如:
(definep(cons45))=>(4.5)
(carp)=>4
(cdrp)=>5
还可以用set-car!
和set-cdr!
来分别设定这两个值:
(set-car!
p"hello")
(set-cdr!
p"good")
如此,以前定义的p又变成了("hello"."goo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LISP 语言 教程
![提示](https://static.bdocx.com/images/bang_tan.gif)