Common lisp学习笔记(1)之核心特性:基本语法

Common lisp的核心特性:基本语法

《Successful lisp:Chapter 3 Lesson 1 - Essential Syntax》读书笔记.
第三章主要介绍了Common lisp的核心特性,其余部分参见CLTL2.

列表(Lists):任何被括号包围的代码

比如:

(1 2 3 4) 
(do copy) 
(ID 102412 姓名 秦艾德) 
() ;空列表 
(()) ;也是空列表 
((1 2 3) 4) ;列表嵌套
(defun factorial (x) 
    (if (eql x 0) 
        1 
        (* x (factorial (- x 1)))))
注意左右括号一定要匹配,下面的列表是不符合语法的:

(a b c(
())
(()

一般来讲,lisp编译环境会警告语法错误,使用带有括号匹配功能的编辑器可以有效避免括号不匹配问题.
由于lisp的代码与数据采用一样的表达方式,这使得lisp得以较为轻易地打破代码与数据的区别壁垒,换言之:可以较为轻易地操作数据一般地操作代码.这为lisp带来了非常诱人的灵活性.

原子(atom):不是列表的其它代码

比如:

1
342
1/4
我们
b大头
@7758
0
-
*
%^&*

原子通过空格或括号与其它原子或列表分隔.
lisp允许使用各种字符(除了括号与空格)来为原子命名,没有命名规则(只要不重名)并且不区分英文大小写.不过lisp程序员有他们自己的命名习惯,毕竟可以方便彼此读懂对方的代码.
由于lisp的括号同样可以起到区分原子与列表的作用,所以lisp编译器本身并不要求在括号旁添加空格,比如下面的代码是同质的:

(defun factorial (x) (if (eql x 0) 1 (* x (factorial (- x 1)))))

(defun factorial(x)(if(eql x 0)1(* x(factorial(- x 1)))))

显然第一行代码的可读性不如第二行,为了提高可读性,通常使用换行以及缩进的书写风格(也有自动缩进功能的编辑器),正如《ANSI common lisp》所言,良好缩进的lisp代码即使未使用括号也可以被熟练的lisp使用者读懂(手写草稿时可以体验一下):

(defun 阶乘 (x)
    (if (eql x 0)
        1
        (* x (阶乘 (- x 1)))))

已上就是所需要知道的lisp基本语法的全部。

猜你喜欢

转载自blog.csdn.net/skydoot/article/details/80198002