程序的基本形狀

又名:寫給不懂編程的人算法

一時興起,用了差很少十天的時間,爲「不懂編程」的人寫了一系列的形散神不散的散文。這是我在這一年裏作的我以爲最有意義的一件事,固然在我身邊的人看來,這多是我在這一年裏作的最遊手好閒的事了。編程

「不懂編程」的人是加了引號的。這我的不是會編程的人,也不是不會編程的人,實際上這我的是我。也就是說,這一系列文章,不過是自嗨。拿出來示人,是本身以爲挺不錯的東西,覺得別人也會以爲挺不錯。極可能這種感受是錯誤的。segmentfault

這些文章將 Emacs 做爲一臺可編程的機器,以 Emacs Lisp 做爲編程語言。編程語言

對於 Lisp 語言,在寫這些文章以前我只是略懂。如今我所掌握的 Emacs Lisp 的知識基本上都在在這個系列的文章裏。這些知識基本上是我在寫這些文章的過程當中現學現賣,只不過是以我最喜歡的方式來賣的,其中還夾雜了一點奇怪的東西——我對這個世界的淺見薄識。函數

在這十二篇文章裏,我很不學術也很不嚴肅地介紹了計算機原理、Emacs 的基本用法,以及 Emacs Lisp 的函數、變量、遞歸、Y 組合子、動態域/詞法域、宏等知識,還講述了 Emacs Lisp 版本的快速排序與列表的遞歸遍歷程序的編寫。我將這些知識稱爲程序的基本形狀。翻譯

這些文章的目錄以下:設計

  1. Emacs 是一臺計算機:論證了 Emacs 本質上是一個可編程的機器——圖靈機。
  2. 第一聲問候:介紹瞭如何在 Emacs 裏編寫一個世界上被寫過得最多的程序——hello world。
  3. 勤勞,仍是懶惰?:神神叨叨的做者現身說法,強調了編程的意義——讓咱們更省力。
  4. 原子與虛空:介紹了構成程序的基本構成以及程序和 CPU 的關係。
  5. 周而復始:對於遞歸,我可能和不少人的認識不一樣,在我眼裏,它是個發動機。程序也不是由表達式或命令構成的東西,而是一部由 CPU 驅動的機器。
  6. 紅藥丸,仍是藍藥丸:一本正經的對條件表達式進行了一番胡說八道。
  7. 周遊抑或毀滅世界:這一篇,算是與 Emacs 最親密的一篇。其實,我本來想用不少篇幅介紹能夠擴展 Emacs 功能的 Emacs Lisp 編程方面的知識,只不過寫着寫着就下了道。
  8. 無名:Y 組合子的推演。
  9. 長長的望遠鏡:介紹了 Emacs Lisp 的動態域/詞法域,是對第 8 篇的補充。
  10. 從混亂到有序:煞有介事的介紹瞭如何用 Emacs Lisp 實現一個快速排序程序,穿插着介紹了向量與列表相關的一些功能。
  11. 咒語:介紹了 Emacs Lisp 的強大的宏的用法。Lisp 的宏一直都很強大,像失傳好久而被現代人認爲失靈的咒語。
  12. 無所遁形:介紹瞭如何讓程序深刻探索重重疊疊的列表的任何一個角落,算是對遞歸函數的認知再做一次強化。

更新說明: code

2017.12.06:利用 let 表達式對第 12 篇的 list-map 函數進行了簡化。排序

2017.12.07:爲第 6 篇補充了一個例子,它是對第 3 篇定義的 c-malloc 函數所作的改進。遞歸

2017.12.07:爲第 10 篇補充了一種守株待兔式的理解遞歸的方法。

2017.12.08:從新梳理了一遍對第 8 篇,克服了一些文字不通順而致使難以理解的問題。

雖然這些文章講的是如何用 Emacs Lisp 語言在 Emacs 環境中編程,可是一個事,你用英語來說,仍是用漢語來說,事沒有變,只是外在的形式變了。所以這些文章裏所說的這些事,可能還都是你們常常碰見的。退一步說,學點 Lisp 也不算壞事。

前面已經說了,這些文章僅僅介紹了程序的基本形狀,就像歐氏幾何學裏的三角形、四邊形之類的東西。要想編寫更復雜並且也更有用的程序,應該去看那些介紹了程序更復雜的形狀的書。

接下來,對於編程的初學者,我建議的是,在參與編程這項工做的過程當中,不妨再啃幾本下面這樣的書:

  1. 假若對 Lisp 發生了興趣,就去看《計算機程序的構造與解釋》,最好中文譯本與英文原版都找到,對照着看。
  2. Hello world 程序的始做俑者,Brain Kernighan 寫的《C 程序設計語言》,最好中文譯本與英文原版都找到,對照着看。之因此要看看 C 語言,是由於它面對的機器要比 Emacs 硬,啃起來,不當心就崩了牙。
  3. 《如何求解問題:現代啓發式方法》,這本書會介紹一些有用的算法,在解決實際問題中有用,而不是在考試或比賽中有用。不過,這本書是差很少是被翻譯毀掉了的書,最好找到英文本來來看,而將中文譯本看成谷歌翻譯結果來看。

假若只是對 Emacs 有了興趣,那就去看 Emacs 與 Emacs Lisp 的官方文檔。

相關文章
相關標籤/搜索