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卡在右元素,你會拿不到內容阿(笑)

LISP基本概念(1)

繁體中文的LISP的網路教學太少,只好自己寫筆記
起始原因只是因為AutoCAD用的很火大,想要自己寫Batch Script來做轉換
很不巧AutoCAD使用的是VisualLISP,前身是AutoLISP,最最原始的就是LISP,或者我們說是CommonLISP。新潮一點的,可以找Clozure CL

參考網站

  • 維基教科書:LISP入門 - (正體中文)說實在的他不是一個教學AutoLISP的網站,內容也有點舊,但是這是我能看到比較完整的LISP正體中文教材。
  • AfraLISP() - (English)在Google能查到的AutoLISP/Visual LISP免費教學網站,一開始由Kenny Ramage建構,有經過大改版,有很多入門文章。
  • OffshoreCad AutoLISP (SpeedDraft) - (日本語)某公司放出來的教學。也有放出原始碼供參考,算是源碼參考的好站點吧。

LISP的基礎

第一個重點,LISP是一種前制運算元的語言。換句話說,你必須改掉在其他編程語言的習慣。

舉例來說,在一般的加法上,我們也許會寫
a+b
但是在LISP裡面,你必須寫成像這樣
(+ a b)

同理可證,
A*B
必須寫成
(* A B)

ok,這是基本的二元運算,現在我們來看看函數function。
一般的編程語言中,我們會寫
f(x)
而在LISP之中,他會看起來像是
(f x)
直接將引數放在函數名後面,很容易理解吧

當有兩個以上的引數時要怎麼寫呢?在一般的語言中,他會長得像
f(x,y)
而在LISP中,他會看起來像是
(f x y)
非常直覺,很好

最後一個重點,LISP之中指令(或說函數名)是大小寫不分的。

GoogleCode-Prettify

SyntaxHighlighter

人気の投稿