Lisp语法和语义

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

  1. 考察两个含有相同字符的字符串的的等价性时忽略大小写

  2. 只要数字表示相同意义上的值,它们在EQUALP下面就是等价的

  3. equalp等价的元素所组成的列表也是等价的

  4. 带有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
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
四曲的头像-四曲博客

昵称

取消
昵称表情代码图片