今天首先归纳一下书上的前三章。这本书的特点是首先创设一个情景,在这个情景下解决实际问题,然后将scheme语法加入讨论的过程中。这个特点和国内的编程教育不同,国内编程比如C语言、java语言大多都是直指核心,直接讲述语法。这点需要注意。
一、数字
数字是第一个程序概念,数字可以引申为数据,当然计算机存储的意义上数据还包括字符、字符串以及lisp独有的符号(symbol)类型。数字及其运算的处理很重要,是计算机运算的基础。在C语言中,数字类型包括整型、浮点型两种,懂C语言的人都知道这两种存储方式不同,进行相互转换必须要程序员亲自操笔。后来在javascript中学到原来可以进行自动转换。scheme也是如此。它处理数字有一种层次。它将整数看做有理数,将有理数看做实数,将实数看做复数。如下
integer(整数) -> rational(有理数) -> real(实数) -> complex(复数)
这样在逻辑上数字就会得以转换。其实计算机为什么不能进行做到人工智能呢?或者说只能在一定程度上模拟?其实这和计算机的数值处理能力有关。
scheme 数字天然是数字。例如3就代表数字3。和其他语言没有什么差别。
二、表达式
这里以几个例子讲述。
(+ 3 4) -> 7
(sqr 12) -> 3.464101615
(+ (* 3 4) 5) -> 17
lisp的特点就是“操作符放在前面,很多括号代表运算顺序,相同层级从前到后”。这是我总结的scheme或者说lisp语法特点。
三、变量定义
(define n 12) -> 12
定义变量为n,值为12。类似javascript中var n = 12。
四、函数定义
这里以一个例子来讲述。
(define 'f (lambda (n) (+ n n)))
在drscheme教学使用的语法形式是(define (f n) (+ n n)),这两种形式没有本质差别,这种形式规避了lambda的书写,其实也是一样的。
如果将上式敲入任意一个scheme解释器中,得到的结果是(lambda (n) (+ n n)) 。这个叫lambda表达式。其实如果看关于lisp书籍看得多的话,就会发现lambda表达式其实也是一个list——特殊的lambda list。这里对此不再赘述。
我用C的特点稍微解释一下,"f"是函数名,n是参数,返回n+n。
五、后记
我写的这些内容有些是书上的,有些是网上的,有些是自己体会的。这些都是我读这本书的遇到的疑惑和感悟。很简单,分享一下。如果有疑惑和错误,可以留言。
希望对scheme新手有帮助,高手不喜勿喷。
推荐一个slideshow,是newlisp的。这个是scheme的语法,但是采用动态作用域而不是scheme的词法作用域。可以看一下,了解一下scheme(lisp)语法概观。
http://www.nuevatec.com/manual-intro.html