S-表达式
当读取器读取名字时,读取器将所有名字中未转义的字符都转化成它们等价的大写形式,这样,读取器将把foo、Foo和FOO都读成同一个符号FOO
但是\f\o\o和|foo|将都被读成foo,这是和符号FOO不同的另一个对象
以下有几个重要约定
- 全局变量名字在开始和结尾处带有“*”
- 常量名都以"+"开始和结尾
所有合法的列表形式均以一个符号开始,但是有三种类型的列表形式,它们会以三种相当不同的方式进行求值,求值器必须检测列表开始处的那个符号是一个函数、宏还是特殊操作符的名字。
三种形式
- 函数调用形式
- 宏形式
- 特殊形式
函数调用
函数调用形式的基本语法如下所示:
(function-name argument*)
;先求值1,再求值2,然后将得到的值传给+函数
(+ 2 3)
;先求值(+ 1 2)和(- 3 4)
(* (+ 1 2) (- 3 4))
特殊操作符
特殊操作符可以做到普通函数无法做到的事情
;如果if是一个普通函数,则先求值x,在求值(format t "yes"),再求值(format t "yes")
(if x (format t "yes") (format t "no"))
如果IF是一个函数,则无法确定最后的取值
特殊的符号IF
规则:求值第一个表达式,如果得到非NIL,那么求值下一个表达式并返回它的值。否则,返回第三个表达式的求值,或者如果第三个表达式被省略的话,返回NIL
(if test-form then-form [else-form])
特殊操作符QUOTE
规则:接受一个单一表达式作为其"参数"并简单地返回它,不经求值
(quote (+ 1 2))
宏
宏是一个以S-表达式为其参数的函数,并返回一个Lisp形式,然后对其求值并用该值取代宏形式。宏形式的求值过程包括两个阶段:首先,宏形式的元素不经求值即被传递到宏函数里
真、假和等价
符号NIL是唯一的假值,其他所有的都是真值
符号T是标准的真值
表达式nil、()、’nil以及'()求值结果是相同的,未引用形式将被堪称是对值为符号NIL的常值变量的引用来进行求值
等价谓语
;用来测试“对象标识”,只有当两个对象相同时才是EQ等价的
;数字和字符的对象标识取决于数据类型在特定Lisp平台上实现的方式
;最好不要用eq来测试数字和字符
(eq x x)
;使用eql来测试数字和字符
(eql 1 1.0) ;结果为假
(eql 1 1) ;结果为真
;将递归上具有相同结构和内容的列表视为等价,equal也认为含有相同字符的字符串是等价的
符号equalp
-
考察两个含有相同字符的字符串的的等价性时忽略大小写
-
只要数字表示相同意义上的值,它们在
EQUALP
下面就是等价的 -
由
equalp
等价的元素所组成的列表也是等价的 -
带有
equalp
元素的数组也是equalp
等价的
格式化Lisp代码
函数调用
(some-function arg-with-a-long-name
another-arg-with-an-even-longer-name)
;宏和特殊形式
(defun print-list (list)
(dolist (i list)
(format t "item")))
注释的适用范围
;;;;四个分号用于文件头注释
;;;三个分号的注释将通常作为段落注释应用到接下来的一大段代码
;;两个分号说明该注释应用于接下来的代码上,与代码具有相同的缩进
;用于单行注释
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容