今天归纳第四章《条件表达式和函数》。
一、条件表达式
说到条件表达式,先说布尔型变量(Boolean)。Boolean也是scheme的一个基本类型。lisp在断言时,空表和nil是false,其余都是true。scheme的不同实现有所不同。在drscheme中(原先是MIT Scheme),可以直接为true和false。下面使用drscheme中的规范。
长话短说,直接上代码。
(= 3 3)
这个表达式很简单,就是判断3是否等于3。其实我们在C语言中碰到过”=“和”==“。有时候我们对此非常头疼,还可能出BUG。在scheme中变量的赋值不使用”=“号,使用”define“。局部变量的定义还可能使用”let“等等。这里我们只要知道”=“是判断是否相等。
那么下面就简单了
(< 4 5),(> 3 7)
然后scheme的不同实现提供不同的类型判断。如drscheme中的"empty?"符号是判断list是否为空。这里有一点一定要记住,lisp之所以夸张地说”每一个使用lisp的人,最后都会在发明一种lisp方言“,是因为lisp太灵活了,没有像C、java等等统一的标准。所以在不同的解释器下,要首先读用户手册(这点挺烦的,不过如果是大牛也可以自己写解释器不是么)。
二、条件函数设计
函数设计是每个程序设计中首先也是必须要考虑的东西。后面会有若干关于函数的处方”recipe“的解释说明。其实我学习drscheme一个暑假,要说让我收获最大的是应该属于函数的设计规范,这也是学习scheme语言的一大收获。请读者不要小视。
;; is-between-5-6? : number -> boolean ;; to determine whether n is between 5 and 6 (exclusive) (define (is-between-5-6? n) (and (< 5 n) (< n 6)))这个是书上的一个程序。看名字就知道这个函数是判断输入值是否在5与6之间,返回true或false。
仔细看scheme貌似没有return,其实这正是它的特点。lisp语言的特点就是read-eval-print,也就是说求值打印。函数也是在求值。这里define是一个原语(primitive),它也在求值!!!如果你把这个定义语句输入,那么求值后是”(lambda (n) (and (< 5 n) (< 6 n)))“。这是一个lambda列表,也是一个特殊的列表,是一个值(注意啊!开始我就被坑了!drscheme里面没有求值显示,我使用newlisp后才发现这个东西!!!)。
三、后记
今天中午没睡好。下午去找老师关于选课的事,也是碰了一鼻子灰。不过写着写着心情就通畅许多了。有句话说得好,”最重要的就是不要去看远方模糊的,而要去做手边清楚的事“,希望能与诸位分享。