Lisp 入门/第四章 原子和值

维基教科书,自由的教学读本

第四章 原子和值[编辑]

再讲原子[编辑]

这次,我们愿意详细讲解原子

原子可以是任何数,分数,小数,自然数,负数等等。

原子可以是一个字母排列,当然其中可以夹杂数字和符号。

空表就是原子NIL。

在 LISP 解释器中输入引用符(单引号)紧接着输入一个原子,可以返回这个原子本身,就像对列表的操作一样。比如:

'sdf

会返回 SDF。

SDF 是一个普通的原子。像

  • sd2f
  • SDF+
  • SDF*
  • SDF.

都是普通的原子。

但原子中还是不能包含一些特殊字符的,比如逗号:sdf, 。这个会返回错误 Error: A comma has appered out of a backquote. 含义是,逗号出现在了单引号之外。

ATOM运算符[编辑]

判断一个字符序列是不是原子,或者甚至一个元素是不是原子,我们用ATOM运算符。

(atom 'a)
(atom '(3))

上面的第一个表达式返回 T,因为 a 是一个原子。而第二个表达式则返回 NIL,因为 (3) 是一个列表。 换言之, ATOM运算符在参数为原子时返回真,在参数为一个表时或参数构不成原子时返回假。

SETQ运算符[编辑]

首先来看一下


>1

1

>a

Error: The variable A is unbound


很好,我们说过,解译器的功能就是对一个输入的表达式求值而已。1的值自然是1,然而a的值呢,错误说变量A的值还未经绑定。绑定的意思就是类c语言中的赋值。

如何绑定一个变量呢,如下


>(setq a 5)

5


然后,我们再次输入a,情形就不同了。


>a

5


不过,你肯定对输入(setq a 5)之后有一个5出现迷惑不解,setq运算符的意义就是赋值并且将此值返回。就是说,表达式(setq a 5)的值是5 。

我们可以接着


>(setq a 6)

6

>a

6


再然后,我们可以


>(cons a '(3))

(6 3)


现在这样也是可以的:


>(setq a 'b)

B

>(cons a '(3))

(B 3)

>(setq a '(1 2 3))

(1 2 3)

>(cdr a)

(2 3)