⑴ lisp 可以做什麼
樓上都沒說出lisp的特點和本質,總的來說,lisp有兩個特徵:函數式編程和面向語言
函數式編程決定了它與數學有天然的契合度,因此可以利用它來表達數學思想、推演符號類型
面向語言說明lisp是一門可以生成代碼的語言。lisp對待數據和代碼均採用同一種數據結構表示,因此lisp可以優雅的處理自身的代碼。解決問題的時候,你完全可以利用lisp自己設計一門適合問題領域的語言,然後再處理
其實lisp有很多方言:
Elisp:配置神器Emacs
Scheme:最純的lisp,實用的庫很少,一般人只是在學習SICP的時候接觸過,應用方面當然也有, 如作為texmacs的配置語言,還有Gimp的開發。如果利用這門語言學習編譯器的設計將會是一個不錯的選擇
comman lisp:lisp的集大成者,有很多庫可用,可以用來做web開發、人工智慧應用、系統應用程序(如郵件過濾器、mp3、html生成器等等)、類型符號推演
clojure:做網站開發,運行在JVM上,有java基礎比較好入手
AutoLisp:與autocad結合用在繪圖領域
⑵ Lisp 語言優點那麼多,為什麼國內很少運用
其他類似的古代語言包括FORTRAN,COBOL,口齒不清,基本的,和ALGOL家族,這些語言之間唯一的區別是,他們為誰設計,Fortran是專為科學家和工程師,他們對計算機編程是為了解決問題of.cobol是設計業務,最好是反映交易者可以使用計算機era.lisp是計算機科學的研究與設計,最突出的表現是為初學者設計的in.basic研究計算機的基本原理。最後,ALGOL語言是一種計算機程序員修改,演變成其他語言,如C,一個大家庭的Pascal和java。
Lisp失敗的原因是它是支離破碎的,它的分裂是由它的語言性質和特定域方案的風格造成的。網路效應是相反的。越來越少的程序員使用相同的方言,所以它是相對的ALGOL語言家族的總價值。
如果有人正在設計一門語言,我們怎樣才能避免這個問題呢?如果語言的表達能力是我們的目標,就必須以某種方式加以調整。這種語言必須有特殊的限制,以確保編寫代碼的可讀性。Python是一種成功的語言,它已經完成了,其中一些是硬編碼的,而其他的則以習慣的方式存在。
總結:將來,最終會有一種流行的語言像Lisp一樣。
⑶ LISP代碼是什麼
LISP(全名LISt Processor,即鏈表處理語言),由約翰·麥卡錫在1960年左右創造的一種基於λ演算的函數式編程語言。
LISP有很多種方言,各個實現中的語言不完全一樣。各種LISP方言的長處在於操作符號性的數據和復雜的數據結構。1980年代Guy L. Steele編寫了Common Lisp試圖進行標准化,這個標准被大多數解釋器和編譯器所接受。在Unix/Linux系統中,還有一種和Emacs一起的Emacs Lisp(而Emacs正是用Lisp編寫的)非常流行,並建立了自己的標准。
LISP的祖先是1950年代Carnegie-Mellon大學的Newell、Shaw、Simon開發的IPL語言。
LISP語言的主要現代版本包括Common Lisp和Scheme。
lisp擁有理論上最高的運算能力
1 基本介紹
Lisp的表達式是一個原子(atom)或表(list),原子(atom)是一個字母序列,如abc;表是由零個或多個表達式組成的序列,表達式之間用空格分隔開,放入一對括弧中,如:
abc
()
(abc xyz)
(a b (c) d)
最後一個表是由四個元素構成的,其中第三個元素本身也是一個表。
正如算數表達式1+1有值2一樣,Lisp中的表達式也有值,如果表達式e得出值v,我們說e返回v。如果一個表達式是一個表,那麼我們把表中的第一個元素叫做操作符,其餘的元素叫做自變數。
Lisp的7個公理(基本操作符):
(quote x)返回x,我們簡記為'x
(atom x)當x是一個原子或者空表時返回原子t,否則返回空表()。在Lisp中我們習慣用原子t表示真,而用空表()表示假。
> (atom 'a)
t
> (atom '(a b c))
()
> (atom '())
t
現在我們有了第一個需要求出自變數值的操作符,讓我們來看看quote操作符的作用——通過引用(quote)一個表,我們避免它被求值。一個未被引用的表達式作為自變數,atom將其視為代碼,例如:
> (atom (atom 'a))
t
反之一個被引用的表僅僅被視為表
> (atom '(atom 'a))
()
引用看上去有些奇怪,因為你很難在其它語言中找到類似的概念,但正是這一特徵構成了Lisp最為與眾不同的特點——代碼和數據使用相同的結構來表示,而我們用quote來區分它們。 (eq x y)當x和y的值相同或者同為空表時返回t,否則返回空表()
> (eq 'a 'a)
t
> (eq 'a 'b)
()
> (eq '() '())
t
(car x)要求x是一個表,它返回x中的第一個元素,例如:
> (car '(a b))
a
(cdr x)同樣要求x是一個表,它返回x中除第一個元素之外的所有元素組成的表,例如:
> (cdr '(a b c))
(b c)
(cons x y)要求y是一個表,它返回一個表,這個表的第一個元素是x,其後是y中的所有元素,例如:
> (cons 'a '(b c))
(a b c)
> (cons 'a (cons 'b (cons 'c ())))
(a b c)
2 Common LISP的Hello World程序
下面是一個在標准輸出設備上輸出Hello World的簡單程序,這種程序通常作為開始學習編程語言時的第一個程序:
(format t "Hello, world!~%")
⑷ 函數式編程的特點
函數式編程具有五個鮮明的特點。
1、函數是"第一等公民"
所謂"第一等公民"(first class),指的是函數與其他數據類型一樣,處於平等地位,可以賦值給其他變數,也可以作為參數,傳入另一個函數,或者作為別的函數的返回值。
2、只用"表達式",不用"語句"
"表達式"(expression)是一個單純的運算過程,總是有返回值;"語句"(statement)是執行某種操作,沒有返回值。函數式編程要求,只使用表達式,不使用語句。也就是說,每一步都是單純的運算,而且都有返回值。
3、沒有"副作用"
所謂"副作用"(side effect),指的是函數內部與外部互動(最典型的情況,就是修改全局變數的值),產生運算以外的其他結果。
4、不修改狀態
上一點已經提到,函數式編程只是返回新的值,不修改系統變數。因此,不修改變數,也是它的一個重要特點。
5、引用透明性
函數程序通常還加強引用透明性,即如果提供同樣的輸入,那麼函數總是返回同樣的結果。就是說,表達式的值不依賴於可以改變值的全局狀態。
⑸ Python和lisp在函數式編程上有哪些異同
Python內在的函數式功能
自Python 1.0起,Python就已具有了以上所列中的絕大多數特點。但是就象Python所具有的大多數特性一樣,這些特點出現在了一種混合了各種特性的語言 中。和Python的OOP(面向對象編程) 特性非常象,你想用多少就用多少,剩下的都可以不管(直到你隨後需要用到它們為止)。在Python 2.0中,加入了列表解析(list comprehensions)這個非常好用的」語法糖「。 盡管列表解析沒有添加什麼新功能,但它讓很多舊功能看起來好了不少。
Python中函數式編程的基本要素包括functionsmap()、rece()、filter()和lambda運算元(operator)。 在Python 1.x中,apply()函數也可以非常方便地拿來將一個函數的列表返回值直接用於另外一個函數。Python 2.0為此提供了一個改進後的語法。可能有點讓人驚奇,使用如此之少的函數(以及基本的運算元)幾乎就足以寫出任何Python程序了;更加特別的是,幾乎 用不著什麼執行流程式控制制語句。
所有(if,elif,else,assert,try,except,finally,for,break,continue,while,def)這 些都都能通過僅僅使用函數式編程中的函數和運算元就能以函數式編程的風格處理好。盡管真正地在程序中完全排除使用所有流程式控制制命令可能只在想參 加」Python混亂編程「大賽(可將Python代碼寫得跟Lisp代碼非常象)時才有意義,但這對理解函數式編程如何通過函數和遞歸表達流程式控制制很有 價值。
剔除流程式控制制語句
剔除練習首先要考慮的第一件事是,實際上,Python會對布爾表達式求值進行「短路」處理。這就為我們提供了一個if/elif/else分支語句的表達式版(假設每個分支只調用一個函數,不是這種情況時也很容易組織成重新安排成這種情況)。 這里給出怎麼做:
對Python中的條件調用進行短路處理
Python
# Normal statement-based flow control
if <cond1>: func1()
elif <cond2>: func2()
else: func3()
# Equivalent "short circuit" expression
(<cond1> and func1()) or (<cond2> and func2()) or (func3())
# Example "short circuit" expression
>>> x = 3
>>> def pr(s): return s
>>> (x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))
'other'
>>> x = 2
>>> (x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))
'two'
我們的表達式版本的條件調用看上去可能不算什麼,更象是個小把戲;然而,如果我們注意到lambda運算元必須返回一個表達式,這就更值得關注了。既然如我 們所示,表達式能夠通過短路包含一個條件判斷,那麼,lambda表達式就是個完全通用的表達條件判斷返回值的手段了。我們來一個例子:
Python中短路的Lambda
Python
>>> pr = lambda s:s
>>> namenum = lambda x: (x==1 and pr("one"))
....or (x==2 and pr("two"))
....or (pr("other"))
>>> namenum(1)
'one'
>>> namenum(2)
'two'
>>> namenum(3)
'other'
將函數作為具有首要地位的對象
前面的例子已經表明了Python中函數具有首要地位,但有點委婉。當我們用lambda操作創建一個函數對象時, 我們所得到的東西是完全通用的。就其本質而言,我們可以將我們的對象同名字」pr」和」namenum」綁定到一起, 以完全相同的方式,我們也也完全可以將數字23或者字元串」spam」 同這些名字綁定到一起。但是,就象我們可以無需將其綁定到任何名字之上就能直接使用數字23(也就是說,它可以用作函數的參數)一樣,我們也可以直接使用 我們使用lambda創建的函數對象,而無需將其綁定到任何名字之上。在Python中,函數就是另外一種我們能夠就像某種處理的值。
我們對具有首要地位的對象做的比較多的事情就是,將它們作為參數傳遞給函數式編程固有的函數map()、rece()和filter()。這三個函數接受的第一個參數都是一個函數對象。
map()針對指定給它的一個或多個列表中每一項對應的內容,執行一次作為參數傳遞給它的那個函數 ,最後返回一個結果列表。
rece()針對每個後繼項以及最後結果的累積結果,執行一次作為參數傳遞給它的那個函數;例如,rece(lambda n,m:n*m, range(1,10))是求」10的階乘」的意思(換言之,將每一項和前面所得的乘積進行相乘)
filter()使用那個作為參數傳遞給它的函數,對一個列表中的所有項進行」求值「,返回一個由所有能夠通過那個函數測試的項組成的經過遴選後的列表。
我們經常也會把函數對象傳遞給我們自己定義的函數,不過一般情況下這些自定義的函數就是前文提及的內建函數的某種形式的組合。
通過組合使用這三種函數式編程內建的函數, 能夠實現范圍驚人的「執行流程」操作(全都不用語句,僅僅使用表達式實現)。
⑹ Lisp 語言優點那麼多,為什麼國內很少運用
之前在學校學編程的時候,偶然間聽過這種語言,還是挺意外的,畢竟在中國這種語言太冷門了。有些人估計都沒聽說過這種語言啊。
我認為一個語言的沒落失敗必定是因為他不適應這個社會的需求和發展。只有隨時順應社會人編程的需求和習慣還能更好的別使用。Lisp失敗的原因是因為它的碎片化,並且它的碎片化是因為其語言天性與特定領域方案的風格造成的。而網路效應則恰恰相反。越來越少的程序員使用相同的方言,因此它相對與ALGOL語言家族的總價值下降。