land of lisp 是一本非常基础的入门教材,但是尽管基础,还是要求读者对lisp是表控式的语言有明确的概念的。
也就是说,通常lisp的表达式一般是是如下结构的:
(function_name variable)
了解到这一点,lisp语言就好理解了。
在land of lisp 的第一章中讲述了如何写一个猜数字的游戏,我剔除具体的游戏内容,总结和讨论一下lisp中的语法。
讨论环境是lispbox,common lisp实现采用的sbcl。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^我分^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
………………………………………………漫长连载的分割………………………………………………………………
首先是定义变量,全局变量。 根据lisper的习惯,全局变量以*开头结尾,例如*foo*
(defparameter *foo* 100)
如此我们就有了值为100的全局变量*foo*
同时我们也可以用如下方法定义:
(defvar *foo* 100)
这两种方法的不同在于f defvar 不能修改已经定义为全局变量*foo*的值,但是defparameter可以,例:
>(defvar *foo* 100)
*FOO*
>(defvar *foo* 200)
*FOO*
>*foo*
100
>(defparameter *foo* 200)
*FOO*
>*FOO*
200
有了变量接下来就是函数的定义了,函数的定义和变量的定义一样:
(defun function_name (variable) (function body))
例如定义函数new-add,实现变量a和b相加:
(defun new-add(a b) (+ a b))
正像大家看到的,定义的函数new-add的函数体是一个表达式,这个表达式和lisp的一般表达式结构相同,表达式的函数名是+,变量是a和b。如果将(+ a b)视为整体,将new-add和(a b)也视为变量,则整个定义函数的过程也是一个表达式,这也暗示了lisp在对待函数和变量方式上是非常相似的,正像其他教材中说的,lisp的函数也是变量,这让lisp变的非同一般的灵活。
书中首先介绍的函数是为运算函数(上来就好高级啊)ash:
>(ash 1 1)
2
>(ash 1 -1)
0
是吧,就是为运算啦。
接下来就是另一个函数了,setf,它的作用类似于defparameter,但是有所不同:
(setf a 90)可以将a的值变为90,看起来和defparameter作用相同,实际上有两点不同:
1、 defparameter 返回的是变量名称,setf返回的是变量值,很多时候这种返回值上的差异是没有什么关系的,但是当你理解lisp是符号语言的时候,你会觉得这种差异是多么的美妙,呵呵
2、 setf是可以用在局部变量上的,这个在写道局部变量的部分再说
最后,一篇文章不能太长……那我再说一点:
1+和1-也是函数……当然2+什么的不是函数啊
>(1+ 4)
5
>(1- 4)
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~End page 27