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)