1、scheme 自学教程导读: 由 stelee 于 周二, 11/13/2007 - 08:52 提交。programming 译者说:其实很久都没有完完整整做过什么事情了,有过很多计划,很多构想,而完完整整做下来的却几乎没有。这也许是我一直郁闷生活的根本原因吧。这篇文档其实翻译了很长时间,中间又有这样或者那样的事情耽误了。终于把前几章翻译完了,先贴上来,鼓励鼓励自己。希望大家喜欢。 Scheme 自学教程 http:/www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html 前言 这是一篇 Scheme 程 言的 。其 是 一 的。也 是 一
2、 了 前的一 导 说 。 本文 读者 实的Scheme程。我currency1“Scheme程的,我也有fifl 言中那 , , 或这”的 , all-with-current-continueation 言的。我的 中 的 上,而是 于 言的 上。我 了很多 的Scheme教程。本教程中 了 样的说教 或者 于 而上学的 ,我是说这 都 ,而本教程的 是 提一 的实 。 那么“ 有多 我想的说一 21 自学完有的 ,我也说过 一 下 了Schema的本 。于Scheme 本来说, 有的 的 ,大 需 50页纸的描述。这么说来,花一 下 看完全部的 倒也是可 的事情当这之前需 很多 下 断的做
3、尝试直“达“禅的最境界。这 是我的一 简单 。 得承认,我感谢Matthias Felleisen把我 入了Scheme和效 程的世界。感谢Matthia Flatt创造了舒适合的MzSchema,我这本书中 示例 言, 给读者。 第一章: Scheme之旅 一 计算机的 ,一般第一条程都是“Hello World”。那么赶 打 你最喜欢的文本 辑器,创建一 文本文件hello.scm 且敲入下 : The first program (begin (display “Hello,World!“) (newline) 第一行是一 注释。当Scheme 译器看“一 分号, 忽略分号后 有的 。
4、号 起来的部分我成 form(译者注:计算机 言的翻译一向都是一 争议的焦点, 我 翻译了。), Scheme里,通过begin- form ,里可 一 列的subform。 上述的程中,有两 subform,第一 调了display过程来输出它的 数(也 是字符串“Hello World”)“命令行(或者我成 输出),着调newline过程,来输出一 换行。 了运行这段程,首先需 调你的Scheme 释器。一般 你的操 的命令行里敲入Scheme的名称 可了。 , 果实MzScheme,你可 命令行里敲入 mzscheme 这样, 可调Scheme的 释器了(译者注:原文是listener,
5、监视器),可读入你的输入-执行-打印执行结果。后等待 多的输入。这 过程 被称之 read-eval-print 循环。注一点的是,它和你操 普通的命令行程没有什么区别,都是读入命令后执行最后等待 多的输入。和操 一样,Scheme 释器也有自己的输入等待符一般这是“”,但是有时候也可 是其 的。 等待输入符下 hello.scm程,可通过一条Scheme 来实 (load “hello.scm“) Scheme 释器 执行hello.scm中的 ,输出Hello,World 和一 换行。后 fi“等待输入符,等待你的 输入。 你 有了 的一 释器,其实你 都 文本文件里输入你的程后 执行。
6、简单的 是,直 命令输入符里输入: (begin (display “Hello,World!“)(new line) 着, 可看“执行结果 Hello,World! 事实上, 简单的 ,是 命令行下直输入“Hello,World!”,你也 上看“执行结果 “Hello,World!“ 因 这是 释器的 fi “Hello,World!“。 第二 之 于,结果 有一 号把结果 起来。最后两 程的 一 区别 于,第一 ( 是begin 的那一 )执行 Hello,World!过是通过display调,输出“ 的输出。第二 程,form “Hello,World!“需 执行一 结果,这 情下, f
7、i和form中字符串一样的结果。 一 ,我 实 来 示一 执行结果, v : (begin (display “Hello,World!“) (newline) ) ( nothing或者void fi ),它有一 字符串输出 Hello,World! “ 输出。 一 “Hello,World!“ “Hello,World!“ 情 下,我可通过输入 (eit) 来出Scheme 释器。 命令行 释器的交环境是一 的程或者程段的currency1段,但是是 的。你也许希望通过一 命令 执行你 的scheme程,而是是交环境打交“。 MzScheme中,你可这样来实 : mzscheme -r h
8、ello.scm 这样 可直执行Scheme本,而出命令行交环境。 你直输入 echo Hello,World! 一样。你fi可把hello.scm 操 的命令行程来执行(通过shell本或者fl 文件),过我“1 章 这。 第二章 数 一 数,是一 列 的 的结合。这 合本是可分的,且 被有一的结构 。Scheme有一 列”的数:一 是简单数(可的), 一 通过合其 的数成了数。 2.1 简单数 简单数 了 数字 字符和符号。 2.1.1 Scheme的,通过 t来 true, f来 false。且通过 boolean来断其后的 数是是。 (boolean t) t (boolean “He
9、llo,World!“) f 过程not 来 数 。 (not f) t (not t) f (not “Hello,World!“) f 于最后一 Scheme本的 释是: 一 需 的上下文环境中,Scheme把 有是 f的 true。 2.1.2数字 Scheme 言中的数字可是整数( ,2),分数(22/7),实数(3.11 )或者数(2 3i)。而且整数本是一 分数,分数是一 实数,实数是一 数。可下的 来数: (number 2) t (number t) f (comple 2 3i) t (real 2 3i) f (real 3.11 ) t (real 22/7) t (re
10、al 2) t (rational 2 3i) f (rational 3.11 ) t (rational 22/7) t (integer 22/7) f (integer 2) t Scheme的整数需 而 的 。当,你也可通过 数字前上前“ b”来 示你 二 。因, b1100 是 里的12。样的,8 前“ o”,1 或者 d。 通过通操 符 e v,可试两 数字是 等。 (e v 2 2) t (e v 2 f) f (e v 2 2.0) f 一 来说, 果你 “ 的两 数都是数字,那么“ ”操 符, 合适。 ( 2 2) t ( 2 f) ! ( 2 2.0) t 其 的数 操
11、符 。 ( 3 2) f ( .5 3) t 算 过程 , -, , /, 等都有我想 一 的 : ( 1 2 3) (- 5.3 2) 3.3 (- 5 2 1) 2 ( 1 2 3) (/ 3) 2 (/ 22 7) 22/7 (ept 2 3) 8 (ept 1/2) 2.0 于单一 数操 符,“-”和“/” 分别 fi 数或者倒数。 (- ) - (/ ) 1/ 过程 “ma”和 “min” fi长 数里最大的和最 的。 (ma 1 3 2 3) (min 1 3 2 3) 1 过程 “abs” fi 。 (abs 3) 3 (abs -) 当,我这里的 是 一 。Scheme提 了一
12、 大的而且的数学和 数。 atan ep和s rt分别 fi 数 根。 果你想了 多 , 5 S 23 2.1.3字符 Scheme的字符通过前 来 。因 , c是字符c, 有一 示的字符需 多的名字来描述, newline, tab, 可 来 述或者 space来 示。 字符串可通过前 char 来断: (char c) t (char 1) f (char ) t 注,分号字符串 这里 一 注释了。字符串数通过 下一操 符来 行 :char ,char,char 。 (char a a) t (char t (char a b) f 果 的时候区分大 , 操 时 char-ci而char:
13、 (char-ci a ) t (char-ci t 字符大 换 char-downcase或者char-upcase: (char-downcase ) a (char-upcase a) 2.1.符号 我前看“的 简单的数被称 “自我 (self-evaluation)”的数。 果你吧这 数的 敲“ 释器里,结果 被 释器 算出来当和你敲 的 是一样的 t t 2 2 c c 但是,符号(Symbol) 一样了。这是因 符号 Scheme 程中被称 。因 结果是本 的。过,符号 是一 简单的数,且符号可 Scheme 的 有,字符 数字或者其 。 了区分符号和其 的,你应该 键 uote来
14、 示一 符号。 ( uote yz) yz 这应该是Scheme里最最 的 了,但是 一 简略的 似乎的 多 其 ( uote ) Scheme符号呗一 列字符串来命名,唯一的限 于 与其 的数混淆, 字符串 数字或者混合数。举 例子: this-is-a-symbol i18n fi$! 都可 符号的名字,而1 -i(数) t “this-is-a-string“(barf) 是。的是 键字 symbol: (symbol yz) t (symbol 2) f Scheme symbols are normally case-insensitive. Thus the symbols alo
15、rieand calorieare identical: Scheme符号一般是大 敏感的,也 是说stephen和Stpehen是的。 (e v Stephen stephen) t 通过define 键字,我可把一 yz的符号 一 全局: (define yz 9) 也 是说把数 9储存“yz中了, 果你 释器来查看yz的 , 下示: yz 9 改的 , 须 单 键字 set!: (set! yz c) yz c 2.2 数 谓的数, 是通过 本合而成。 2.2.1 字符串 字符串 是一 列字符的列(这里符号一样,符号是字符列的合 名字来 )你可通过 号来 字符串。字符串也是自 的。 “H
16、ello, World!“ “Hello, World! 可通过 string 过程来把一 列的字符连 起来成一 字符串。 (string h e l l o) “hello“ 让我 一 全局的字符串: (define greeting “Hello Hello!“) 注, 这 里的分号 再 注释的 了。 , 于熟悉命令 程 言的 来说,把字符串 一 数来也是一 很有思的 。 Scheme里我依可这么做,需一 叫做string-ref的 。 (string-ref greeting 0) H 通过string-append ,可把几 字符串连 一起。 (string-append “ “ “P
17、luribus “ “Unum“) “ Pluribus Unum 你fi 长度的字符串,且 你喜欢的时候填上你 希望的字符。make-string 。 (define a-3-char-long-string (make-string 3) The predicate for checking stringness is string. 和你 预期的一样,字符串的 是 string . 通过string-set! ,我可改索 下字符串字符的 。 (define hello (string H e l l o) hello “Hello“ (string-set! hello 1 a) hel
18、lo “Hallo“ 2.2.2 向 Vectors are se uences like strings, but their elements can be anything, not just characters. Indeed, the elements can be vectors themselves, which is a good way to generate multidimensional vectors. 也许你过Java来 自己的程。那么Vector也许你也 其有 了咯。 Scheme里,Vector和字符串似,但是储存的 仅仅是字符了,可是 Scheme中的数,
19、Vector本这样我 可很 易的建起多维度的向。 下这 例子我建了一 由五 整数成的向。 (vector 0 1 2 3 ) (0 1 2 3 ) Note Schemes representation of a vector value: a character followed by the vectors contents enclosed in parentheses. 注Scheme示向的 , 头,把向 放 一 圆 号里。 和make-string很似,通过make-vector可来生成一 长度的向。 (define v (make-vector 5) 样“ ,通过vector-re
20、f和vector-set!可访修改向 中的 。通过vector来数。 (译者插话:大家可试试字符串是是一 的向) 2.2.3 点 (dot pair)和列 (译者又插话了:其实翻译这篇文档很早 了,过中间间断了很长一段时间, 这段时间 ,我囫囵吞枣的看了Haskell, aml还有Python,熟悉这 言的大虾一 “点 或者列 数 程 中占的 的地位了) 一 点 是一 合的数。由 两 数按顺成。其实第一 素我称 car (是汽车哈,呵呵),第二 素我称 cdr。合这两 素的操 cons (cons 1 t) (1 . t) Dotted pairs are not self-evaluatin
21、g, and so to specify them directly as data (ie, without producing them via a cons-call), one must eplicitly uote them: 点 数是自 的数。 想cons 来构造一 点 的话,学 uote 强 。 ( 还 得我的 utoe 吗 ( uote )或者 我也是太清楚 uotesymbol的 , 放 这里,下 再 想想。 ) (1 . t) (1 . t) (1 . t) ! 访 部 素的 分别 car和cdr: (define (cons 1 t) (car ) 1 (cdr ) t