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)