写在前边:Successful lisp是David B. Lamkins 写的一本书,在 http://psg.com/~dlamkins/sl/ 可以看到,该系列blog基本源于该书,加入了一些自己的理解和实践。

 

感谢David B. Lamkins。

 

 

所有代码均在Fedora 14, GCL上测试通过。blog原文在LibreOffice上产生。

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

1 Lisp Syntax

1.1 List

任何被括号()括起来的语句内容都是list。比如:

(a b c)

(money 77 pig 88)

其中包括空list,以及嵌套list:

()

(a b (1 3 ) c )

但不匹配的()所包围的内容不是list。比如:

(a (c )

( ()

(a b c

 

list 可以是一些数据,也可以是一段程序。同时,list可以嵌套list,所有list可以同时包括一些数据和一些程序段。

 

接下来,我们介绍atom。list中通过空格分开的元素,称之为atom。比如以上例子中的数字和单词,同时嵌套的list中的元素也是atom,但是该嵌套的list本身不是atom。比如:

( a b 1 2)

中的a, b, 1, 2都是。但是

(a b (1 3))

中的嵌套的(1 3)不是。

如果list中包含标点符号,并且标点符号后是空格,或者),那么也是一个atom。比如:

(a: - +)

中的- + a:都是atom。需要记着的是,如果有运算符连接的字符串,在Lisp中,并不是运算式,而只是一个atom。比如:

( b-5 c*6)

其中的b-5, c*6 也仅仅是atom,而不是用来计算用的算式。

 

由于atom靠括号和空格来区分,所以任意多的空格的作用和一个空格作用一致。比如:

(c 1 5 9(89 a ))

(c 1 5 9 (89 a))

以上两个list是等效的。

 

此外,如果跨行写的list和一行写的list没有区别,除了更好的阅读。但是我们推荐复杂的list,通过跨行写来提现更好的可读性。

 

总结:

  1. 用括号括起来的语句是list。
  2. List中通过空格区分的字符串是atom。
  3. 标点符号,运算符本身,以及标点符号、运算符链接的字符串也是atom,而不是运算式。
  4. 多个空格,分行的List和一个空格、一行的list作用一致。

 

1.2 Symbol

Symbol就是字符串,尽管对组成symbol的字母和格式会有一些限制,不过目前来说,我们可以认为symbol是由数字,字符以及连字符组成的,但是不要用一个单独的数字来表示一个symbol,那样的话,lisp会认为我们是写了一个数字,而不是一个symbol。以下是一些symbol:

  1. a
  2. b
  3. c
  4. foo
  5. bazz-gill

symbol可以进行一些操作,比如赋值(>为交互式编译器的提示符,;之后的字符为注释,其他所有为编译器输出):

>(setq a 5) ;给a赋值为5

 

我们这里介绍两个特殊的symbol,T和NIL,也可一是t和nil,大小写无关。T或者t在lisp中表示true,nil表示false。除了nil之外的一切都是t。

为了接下来学习的方便,我们可以暂时认为symbol和atom一样。当symbol和atom不一致的情况出现时,我们会指出来,进而分区symbol和atom。

关键字(kerword)

以:开头的symbol就成为关键字(keyword)。比如:

>:bill

:BILL

>:keyword

:KEYWORD