lisp不是函授型語言 LISP語言

2021-10-17 04:48:58 字數 2446 閱讀 4667

[拼音]: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 六,引...