资源预览内容
第1页 / 共36页
第2页 / 共36页
第3页 / 共36页
第4页 / 共36页
第5页 / 共36页
第6页 / 共36页
第7页 / 共36页
第8页 / 共36页
第9页 / 共36页
第10页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
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语言的编程特色的归纳:? 词法定界( Lexical Scoping )? 动态类型( Dynamic Typing )? 良好的可扩展性? 尾递归( Tail Recursive )? 函数可以作为值返回? 支持一流的计算连续? 传值调用( passing-by-value )? 算术运算相对独立本文的目的是让有编程基础(那怕是一点点)的朋友能尽快的掌握 Scheme语言 的语法规则,如果您在读完本文后,发现自己已经会用 Scheme语言了,那么我 的目的就达到了。二. Scheme语言的标准与实现R5RS (Revised(5) Report on the Algorithmic Language Scheme)Scheme语言的语法规则的第5次修正稿,1998年制定,即Scheme语言的现行标 准,目前大多数Scheme语言的实现都将达到或遵循此标准,并且几乎都加入了 一些属于自己的扩展特色。Guile (GNUs extension language)Guile是GNU:程的一个项目,它是 GNUT展语言库,它也是 Scheme语言的一 个具体实现;如果你将它作为一个库打包,可以把它链接到你的应用程序中去, 使你的应用程序具有自己的脚本语言,这个脚本语言目前就是Scheme语言。Guile可以在LINUX和一些UNIX系统上运行,下面是简单的安装过程:下载 guile-1.6.4 版,文件名为 guile-1.6.4. ,执行下面的命令:tar xvfz guile-1.6.4. cd guile-1.6.4 ./configuremakemake install如此,即可以执行命令guile,进入guile提示符状态,输入调试Scheme程序 代码了,本文的所有代码都是在 guile 下调试通过。其它实现 除了 Guile夕卜,Scheme语言的实现还有很多,如: GNU/MIT-Scheme SCI, Scheme48 DrScheme等,它们大多是开源的,可以自由下载安装使用,并且跨 平台的实现也很多。你会发现既有象basic的Scheme语言解释器,也有将Scheme 语言编译成C语言的编译器,也有象JAVA那样将Scheme语言代码编译成虚拟机 代码的编译器。三. 基本概念注释Scheme语言中的注释是单行注释,以分号;开始一直到行尾结束,其中间的内 容为注释,在程序运行时不做处理,如:; this is a scheme comment line.标准的Scheme语言定义中没有多行注释,不过在它的实现中几乎都有。在Guile 中就有多行注释, 以符号组合 #! 开始, 以相反的另一符号组合 !# 结束, 其中 内容为注释,如:#!there are scheme comment area.you can write mulity lines here .!#注意的是,符号组合 #! 和!# 一定分做两行来写。Scheme用做脚本语言Scheme语言可以象sh,perl,python等语言那样作为一种脚本语言来使用,用 它来编写可执行脚本,在Linux中如果通过Guile用Scheme语言写可执行脚本, 它的第一行和第二行一般是类似下面的内容:#! /usr/local/bin/guile -s!#这样的话代码在运行时会自动调用 Guile 来解释执行,标准的文件尾缀是 .scm 。块(form)块(form)是Scheme语言中的最小程序单元,一个Scheme语言程序是由一个或多 个 form 构成。没有特殊说明的情况下 form 都由小括号括起来,形如:(define x 123)(+ 1 2)(* 4 5 6)(display hello world)一个 form 也可以是一个表达式,一个变量定义,也可以是一个过程。form 嵌套Scheme语言中允许form的嵌套,这使它可以轻松的实现复杂的表达式,同时也 是一种非常有自己特色的表达式。 下图示意了嵌套的稍复杂一点的表达式的运算 过程:0 (+ 24) (+ 5 6 7)r* (+ 9 1 T f + S 6 7以看出Scheme语吉的 表达式的特点杲少了 些运算将,多了很多 对勺編号.变量定义 可以用define来定义一个变量,形式如下:(define 变量名值)如:(define x 123),定义一个变量x,其值为123。更改变量的值可以用set!来改变变量的值,格式如下:(set! 变量名值)如:(set! x hello),将变量 x 的值改为hello。Scheme语言是一种高级语言,和很多高级语言(如python,perl) 一样,它的变 量类型不是固定的,可以随时改变。四. 数据类型1. 简单数据类型逻辑型(boolean)最基本的数据类型,也是很多计算机语言中都支持的最简单的数据类型,只能取两个值:#t,相当于其它计算机语言中的TRUE #f,相当于其它计算机语言中 的 FALSEScheme语言中的boolean类型只有一种操作:not。其意为取相反的值,即:(not #f) = #t(not #t) = #f not 的引用,与逻辑非运算操作类似guile (not 1)#fguile (not (list 1 2 3)#fguile (not a)#f从上面的操作中可以看出来, 只要 not 后面的参数不是逻辑型, 其返回值均为 #f 。数字型 (number)它又分为四种子类型:整型 (integer) ,有理数型 (rational) ,实型 (real) ,复 数型(complex);它们又被统一称为数字类型(number)。如:复数型 (complex) 可以定义为 (define c 3+2i) 实数型( real )可以定义 为 (define f 22/7) 有理数型( rational )可以定义为 (define p 3.1415) 整 数型 (integer) 可以定义为 (define i 123)Scheme 语言中,数字类型的数据还可以按照进制分类,即二进制,八进制,十 进制和十六进制,在外观形式上它们分别以符号组合 #b、 #o、 #d、 #x 来作 为表示数字进制类型的前缀,其中表示十进制的#d 可以省略不写,如:二进制的 #b1010 ,八进制的 #o567 ,十进制的 123或 #d123 ,十六进制的 #x1afc 。Scheme语言的这种严格按照数学定理来为数字类型进行分类的方法可以看出Scheme语言里面渗透着很深的数学思想,Scheme语言是由数学家们创造出来的, 在这方面表现得也比较鲜明。字符型 (char)Scheme语言中的字符型数据均以符号组合#开始,表示单个字符,可以是 字母、数字或! $ % & * + - . / : ? A _ 等等其它字符,如:#A 表示大写字母 A, #0 表示字符 0,其中特殊字符有: #space 表示空格符 和 #newline 表示换行符。符号型 (symbol)符号类型是Scheme语言中有多种用途的符号名称,它可以是单词,用括号括起 来的多个单词, 也可以是无意义的字母组合或符号组合, 它在某种意义上可以理 解为C中的枚举类型。看下面的操作:guile (define a (quote xyz)定义变量 a 为符号类型,值为 xyzguile a定义变量 xyz 为符号类型,值为 axyzguile (define xyz a) guile xyz a此处也说明单引号 与 quote 是等价的,并且更简单一些。 符号类型与字符串不 同的是符号类型不能象字符串那样可以取得长度或改变其中某一成员字符的值, 但二者之间可以互相转换。2. 复合数据类型可以说复合数据类型是由基本的简单数据类型通过某种方式加以组合形成的数 据类型,特点是可以容纳多种或多个单一的简单数据类型的数据, 多数是基于某 一种数学模型创建的。字符串 (string) 由多个字符组成的数据类型,可以直接写成由双引号括起的内 容,如: hello 。下面是 Guile 中的字符串定义和相关操作:guile (define name tomson)guile nametomsonguile (string-length name) ;取字符串的长度6guile (string-set! name 0 #g) ; 更改字符串首字母 (第 0 个字符)为小写 字母 g (#g)guile namegomsonguile (string-ref name 3) ;取得字符串左侧第 3 个字符(从 0 开始)#s字符串还可以用下面的形式定义:guile (define other (string #h #e #l #l #o )guile otherhello字符串中出现引号时用反斜线加引号代替,如: abcdef 。点对 (pair)我把它译成 点对 ,它是一种非常有趣的类型,也是一些其它类型的基础类型, 它是由一个点和被它分隔开的两个所值组成的。形如: (1 . 2) 或 (a . b) , 注意的是点的两边有空格。这是最简单的复合数据类型, 同是它也是其它复合数据类型的基础类型, 如列表 类型( list )就是由它来实现的。按照Scheme语言说明中的惯例,以下我们用符号组合=来表示表达式的值。它
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号