[拼音]:lisp yuyan
[外文]:lisp
為非數值符號運算而設計的表處理語言。lisp是英文list processing(表處理)的縮寫。 lisp語言是2023年j.麥卡錫在遞迴函式論基礎上首先設計出來的。lisp語言的形式化程度高,表達力強,適合於描述各種知識和編寫問題求解的程式,因此一直是用來研究人工智慧的一種基本語言。
自然語言中詞可以認為是能單獨用來構成句子的最小單元,由詞可以構成片語,由片語可以構成更複雜的片語或句子。lisp語言的「詞」稱為原子,如15(數值原子)、ifac(非數值原子)。lisp語言的「片語」就是由一組原子構成的有一定形式的表,如(a-kind-of federation)。表和原子可以組成更複雜的表稱為符號表示式(相當於複雜片語)如 (ifac(a-kind-of federation))。
程式結構
符號表示式不但是lisp語言的資料結構形式而且也是它的程式結構形式,也就是說符號表示式可以代表乙個語句,即一段程式。這種資料結構和程式結構在格式上的一致性是lisp語言的顯著特點。從語義角度考慮:對符號表示式求值的函式稱為eval。求值也可用簡式錶出,記為「符號表示式⇒值」。求值規則如下:
(1)數字、t(真)、nil(假,空表)的值就是自身。
(2)如果符號表示式是表,且表的第一元素是函式,那麼首先求出其他元素的值,然後對函式求值,如(plus(times3 5)2)⇒17。
(3)對以保留詞形式出現的函式,其值完全取決於保留詞的意義。如 (setq x (plus 15 1))即對x賦予16的值(setq是對原子賦值的意思)。
(4)如果符號表示式是一原子,那麼其值就是最近賦予的值。
符號表示式的基本操作
如果符號表示式是乙個複雜的表,對其操作可歸結為取、刪、添、並、組合等。為了防止eval將所有表的第一元素都看成函式,引入符號「\」,表示對緊隨「\」後的表或其他符號表示式不求值。也可用函式quote來實現同樣的目的。例如:
(car\(abc))⇒a
car表示取表的首元素
(cdr\(abc))⇒(bc)
cdr表示刪去表的首元素
(cons\a\(bc))⇒(abc)
cons表示在表中添入新的首元素
(list\a\b\(cd))⇒a(ab(cd))
list表示將各元素列入表中作為簡例,下面給出用lisp語言寫的求表 l中各數之和的程式,例如l=(7,5,3,0),則sum(和)之值為15。
prog (sum)
(setq sumφ)
loop (cond ((null l)(return sum)))
(setq sum (plus sum (car l)))
(setq l (cdr l))
(go loop)
這段程式的含義是:用prog引入分程式,它的區域性變元是sum,賦予sum的初值是零(φ),迴圈:條件是,如果l等於空表,則返回sum的值,
否則將sum原來值與表l首元素值之和賦予sum,
將表l刪去首元素後的值賦予表l,
繼續迴圈
使用者自定義函式
lisp語言的使用者自定義函式常用lambda表示式給出,其一般形式為(lambda(atom 1,atom2,…,atom k)e),lambda 之後是一形式參數列,e是有待求值表示式的lisp形式。函式呼叫時,對所有形式引數賦予實在引數的值,然後對函式體 e求值。函式定義的 lambda記法是 j.麥卡錫根據 a.丘奇的 λ演算理論引入程式語言的。lambda是希臘字母λ的英語拼音。這種記法有助於函式定義精確化,是lisp語言中定義非基本函式的普遍方法。例如使用者可自行定義一新函式 exchange(交換):exchange=(lambda(y)(list(cadr y)(car y)))。這樣(exchange\(ab))的值便是(ba),定義中cadr為先作cdr後作car兩次函式運算的簡寫形式。因此,lisp程式的執行可歸結為函式求值,lisp語言是一種函式型程式語言。這是70年代發展起來的新型程式語言。lisp語言的函式定義方式允許被定義函式間相互呼叫,也允許直接或間接地呼叫自身(稱為遞迴)。下面是乙個定義階乘(!)函式的遞迴程式例子。factorial:(lambda (n) (cond (equal n 1)1)
(t (times n
(factorial
(sub1 n)))))
由於在函式體**現被定義函式 factorial,所以這個定義是遞迴的。lisp語言兼有遞迴和迭代(見上例prog)的功能,具有較強的表達力和較大的靈活性。lisp還可用於邏輯程式設計。用於邏輯程式設計的、擴充套件的lisp語言稱為loglisp,它的功能與prolog等價。
lisp語言有很多變種,但最基本的是lisp1.5,比較著名的還有maclisp,interlisp等。
參考書目
winston, horn著,黃昌寧、陸玉昌譯:《lisp程式設計》,清華大學出版社,北京,1983。(p.h.winston and b.k.p.horn,lisp,addison-wesley publ. co., reading, mass.,1981.)
LISP 函式型程式語言
lisp有很多種方言,各個實現中的語言不完全一樣。1980年代guy l.steele編寫了common lisp試圖進行標準化,這個標準被大多數直譯器和編譯器所接受。在unix linux系統中,還有一種和emacs一起的emacs lisp 而emacs正是用lisp編寫的 非常流行,並建立了自...
Lisp語言 陣列
討論了變數以後讓我們來看看lisp中的陣列,對於非lisp程式設計師來講這是再自然不過的了,很多程式語言的教材上都是在講述了一般性語法後講解陣列。不過,lisp程式設計師可能會有點疑問,為什麼不開始介紹列表呢?列表作為lisp語言的關鍵在lisp中起到了重要的作用,所以很多有關lisp的材料都是以介...
Lisp語言入門
目錄 一,執行環境 2,本地互動執行環境 二,輸入輸出 1,輸入 2,輸出 三,變數 1,格式化輸出 2,變數賦值 setf 四,函式 1,無參函式 2,帶參函式 3,關鍵字形參 五,列表 1,表list 按下標取元素nth 2,解引用quote 3,屬性表plist 按key取元素getf 六,引...