跳轉到內容

Common Lisp/CL 案例研究

來自華夏公益教科書

本章的目的是提供一組深入的示例或案例研究,說明如何在 Common Lisp 中實現程式。這裡目標是讓你感受一下完整的 Common Lisp 應用程式可能是什麼樣子。這一點很重要,因為典型的 Common Lisp 應用程式通常不像許多小部分拼湊在一起那樣。程式設計師在 Common Lisp 中可以達到的獨特抽象級別傾向於促使程式將語言定製到目的,並導致開發的整體效率。

本章的另一個目的是突出顯示在其他部分中忽略的一些包。一些 Common Lisp 應用程式/專案,由於各種原因,不適合放在本書的其他地方。一些被排除是因為 Common Lisp 初學者不會覺得它有趣,另一些是因為使用它們有很大的學習障礙,需要太多文字來解釋,還有一些可能是由於最近的開發而變得不穩定,或者停滯不前並遭受了位元腐爛。這些專案仍然有一些非常酷的部分,現在你對 Common Lisp 有了紮實的瞭解,我們可以介紹這些包,並花更多的時間解釋必要的東西。

編寫 Web 應用程式

[編輯 | 編輯原始碼]

眾所周知,Common Lisp 語言缺乏可移植的 GUI 解決方案。我們之前討論過 LTK,它適用於任何安裝了 wish 的人,但對於一些應用程式來說,它令人討厭地慢。提供 GUI 的另一種方法是透過 Web 瀏覽器。動態網頁的 Web 技術(javascript + AJAX + 伺服器端程式)已經發展到足以滿足大多數 GUI 功能的需求。人們付出了很多努力,讓它在任何執行瀏覽器的計算機上看起來都一樣。此外,您可以非常輕鬆地讓您的應用程式在本地和遠端執行。當然,它也會相當浪費 CPU 和記憶體,但 c'est la vie。

  • Common Lisp 中的基於 Web 的遊戲

進一步閱讀

[編輯 | 編輯原始碼]
  • WebBlocks
  • Uncommon Web (UCW)

解決 NP 問題,非確定性

[編輯 | 編輯原始碼]

請耐心等待,因為這是一個相當複雜的計算理論主題。透過編寫非確定性程式碼,可以輕鬆地編寫出解決 NP 問題的方案。沒有這樣的機器能夠在多項式時間內執行該程式碼,但有一些非確定性模擬器可以在指數時間內執行該程式碼。即使這樣的模擬器需要很長時間才能找到一個足夠大的輸入的解決方案,它仍然可以用來在幾分鐘內快速製作一個簡單的實現。更重要的是,這個原型可以被開發,以提供更好的效能或使用近似值來有效地找到接近的解決方案。

幾種語言都有非確定性模擬器。Prolog(透過回溯搜尋)和 Scheme(透過延續)就浮現在腦海中。Common Lisp 有一個提供這種功能的包;它被稱為 Screamer。我們之前討論過 Screamer,但它值得進一步深入的例子。Screamer 對你的程式碼執行所謂的 CPS 轉換,從而產生對非確定性行為的模擬。

  • 使用 Screamer 做一些有趣的事情

進一步閱讀

[編輯 | 編輯原始碼]

Screamer 在 CLiki 上

面向上下文程式設計

[編輯 | 編輯原始碼]

面向上下文程式設計是一種新的程式設計正規化,其中程式碼執行的上下文會修改它的行為。設計者將其視為對面向物件程式設計和麵向方面程式設計想要解決的思想的進一步發展。

  • 使用 ContextL 做一些事情

進一步閱讀

[編輯 | 編輯原始碼]

計算機代數和自動定理證明

[編輯 | 編輯原始碼]

早期版本的 Lisp 在計算機代數(計算機輔助的代數和微積分問題操作和求解)和自動定理證明(計算機輔助的數學定理證明)方面開創了先河。

  • 一個數學簡化程式
  • 從 Maxima 使用 Common Lisp,從 Common Lisp 使用 Maxima
  • 使用 ACL2 證明

進一步閱讀

[編輯 | 編輯原始碼]
  • Maxima — 用 Common Lisp 編寫的計算機代數系統。它是 DOE Macsyma 的後代。
  • ACL2 — 自動定理證明器
華夏公益教科書