SyntaxHighlighter

2016-04-15

[LISP]LISP基本指令-取出表元素

前言

Lisp的全名叫做LISt Processor,事實上內部大部分的元素都是一種表,而且是一種二元樹(binary tree)表。

在LISP裡面有用括號圍起來的都叫做表(table? tree?),比如說
(+ 1 2)
'(hello world)

而沒有用括號圍起來的都是原子,翻譯應該是Atom(我亂唬爛的)。
比如說上面的'(hello world)裡面就有兩個元素helloworld
空白的表,通常會傳回()或是NIL

表操作指令

CAR

好,我在上面有寫到,在LISP裡面其實是用二元樹表儲存所有的資料。所以可以利用一些內建函數去取出裡面的內容。
而CAR是用來取出二元樹的左分支用的內建函數
我們假設有個表長得像'(a b c d),以下的敘述會抓到左分支,也就是a
(car '(a b c d))
記得我上一篇有寫到,LISP裡面是沒有大小寫之分的,所以CARcar在LISP中都是一樣的指令。
某網站有寫到FIRSTCAR的全名,但是在AutoCAD中並不支援...所以還是乖乖開CAR

CDR

有抓到二元樹的左枝了,那也要想辦法抓右枝阿。抓右枝的函數在LISP裡面就叫做CDR
(CDR '(a b c d))
結果會是(b c d)

其他的表元素抽取函數?

好,我們能抽取出左分支,也能抽出右分枝。那我們來練習一下取出第二個元素好了。要在一串LIST裡面取出第二個元素,第二個元素其實就是右分支的左分支,我們可以這樣寫
(CAR (CDR '(a b c d)))
很長喔,所以在AutoLISP裡面有短縮版,就是CDAR
(CADR '(a b c d))
都一樣可以得到我們想要的結果:取得元素b。
那如果我們要取出第三元素呢?OK, AutoLISP又有短縮版可以取得第三元素以後的右分支,CDDR
(CDDR '(a b c d))
他會傳回(3 4)這個表。當然也可以用古老式的逼供法
(CDR (CDR '(a b c d)))
他一樣會傳會(3 4)這個表。
接下來就不用教了吧(笑),開CAR去把左元素取出來阿。
(CAR (CDDR '(a b c d)))
也可以縮寫成以下形式
(CADDR '(a b c d))
以此類推...要記得不要把A卡在右元素,你會拿不到內容阿(笑)

0 件のコメント:

人気の投稿