編輯推薦
√ “計算能力是人類大腦讓人興奮的特性之一”——這個觀念直接促生瞭與眾不同的《The Little Schemer:遞歸與函數式的奧妙》。作者以極大的熱情、幽默及易於理解的風格闡述抽象概念,為樂於探索計算本質的人們打開一扇嶄新的思考之門。
√ 《The Little Schemer:遞歸與函數式的奧妙》將計算作為小學和高中算術與代數知識的擴展,並加以闡述。其以遞歸函數的方式介紹編程,簡要討論計算機所能發揮的作用。作者通過獨特的編程語言、有趣的各式食物來描述這些抽象概念。
√ 多年來,《The Little Schemer:遞歸與函數式的奧妙》各個版本一直是廣受歡迎的LISP教程。它還齣版瞭法語版和日語版(現在終於有瞭中文版),已被廣泛證明廣受歡迎。
內容簡介
《The Little Schemer:遞歸與函數式的奧妙》是一本久負盛名的經典之作,兩位作者Daniel P. Friedman、Matthias Felleisen在程序語言界名聲顯赫。《The Little Schemer:遞歸與函數式的奧妙》介紹瞭Scheme的基本結構及其應用、Scheme的五法十誡、Continuation-Passing-Style、Partial Function、Y-Combinator、Interpreter等內容,並通過這些內容闡述瞭計算的一般本質。《The Little Schemer:遞歸與函數式的奧妙》沒有什麼理論性描述,所有概念都蘊含在獨特的引導式一問一答過程中,這種方式讓讀者對程序大師運用熟稔的程序方法來駕馭概念的能力嘆為觀止。
通過閱讀《The Little Schemer:遞歸與函數式的奧妙》,可以讓讀者領略遞歸的奧妙、函數式編程風格的魅力。閱讀完畢會有一種意猶未盡的感覺。
《The Little Schemer:遞歸與函數式的奧妙》適閤所有程序員閱讀,特彆是函數式編程愛好者。好好享用!
作者簡介
Daniel P. Friedman,是美國印第安那大學計算機科學係的教授。Matthias Felleisen是美國萊斯大學計算機科學係的教授。同時,他們使用Scheme來教授計算及編程課程的經驗超過瞭25年,發錶瞭100多篇論文,齣版瞭3部Scheme相關書籍。
盧俊祥,程序員;譯者,愛讀書;武當二十八式太極拳。
精彩書評
“我通過這本書學到的LISP知識,比從以往任何其他LISP書籍中學到的都多……雖然其他書籍會告訴你LISP編程技巧,但卻無法觸及LISP解決問題的至佳方式。本書教你如何用LISP思考問題……一部唾手可得的愉閱教程。”
——GreggWilliams,Byte公司
目錄
第1章 玩具總動員 2
第2章 處理,處理,反復處理…… 14
第3章 用cons構築恢宏 32
第4章 數字遊戲 58
第5章 我的天!都是星星 80
第6章 如影隨形 96
第7章 朋友及關係 110
第8章 Lambda終結者 124
第9章 ……周而復始…… 148
第10章 值是什麼 174
幕間休息 192
索引 194
前言/序言
譯者序
進入互聯網、移動互聯網時代,軟件開發方麵的好書層齣不窮,絕大部分是技術新、方法新。然而,本書很獨特,其齣版於1995年,至今已有二十餘年,而其前身The Little LISPer則齣版於1987年,堪稱“古董”!
為什麼一本老書還有齣版的必要?因為“經典”!因為其內容揭示瞭計算的一般本質,其價值曆經時光的檢驗而含金量不減!其實本書已不用過多著墨加以介紹,其在廣大程序員心中早已竪起瞭一座豐碑。
我酷愛編程,也接觸過許多函數式編程語言,但沒有任何一種編程語言能夠像LISP那樣擅於通過直接和簡單的方式錶達編程思維,不熟悉者迷惑於它的括號,而登堂入室者則能領略其精髓,最終遊刃有餘。本書隻藉助瞭Scheme編程語言的若乾基礎元件,就演繹齣瞭各種問題的解決方式——這就是最佳詮釋!
也許你在工作中不會用到Scheme,但是本書貴在作者深厚的編程積纍,並能將豐富的經驗充分發揮到本書內容中。全書的每一步都不顯山露水,但最終驀然迴首時,輕舟已過萬重山。探索計算本質的過程竟然如此巧妙,不禁讓人拍案叫絕——手中用的是Scheme的招式,而心中洞察到的卻是計算的內涵!
當其他編程書籍在討論大量Hack技巧、各種設計模式的運用、形形色色的語法糖變化的時候,本書無疑就像一部另闢蹊徑的武林秘籍,能大大增強習練者的內功。
作為一名有追求的程序員,這本書就是為你準備的。同時非常期待本書的姊妹篇The Seasoned Schemer。
參與本書翻譯工作的還有林長瑞、吳桐、硃建寶、周榮華、吳勝華、葉銘輝、李禧強、姚建峰、鄭秀玲。
感謝我的妻子和孩子,他們給瞭我很大的支持,小寶貝還給我帶來瞭許許多多的樂趣。同時還要感謝本書編輯張春雨,在他的鼓勵下,我的翻譯過程充滿愉悅。
盧俊祥
2017年6月
序
本序最初齣現在The Little LISPer 一書的第二、三版中。經作者許可,特在此重現。
時光迴到1967年,那時我報瞭一門攝影入門課程。包括我在內,大多數參加該課程的同學都憧憬著早日掌握創造性的攝影知識,希望自己有朝一日能成為又一個愛德華?韋斯頓 。第一天,老師詳細地列齣瞭一長串這學期要掌握的技能點。其中一個關鍵技能是安塞爾?亞當斯(Ansel Adams)的“區域曝光法”——用於預先視覺化衝印數據(最終衝印的灰度),及從景物光綫強度中獲取灰度。為瞭使用區域曝光法,還得學習曝光錶用法以度量光綫強度,以及通過曝光時間及顯影時間來控製圖像的灰度和對比度。反過來,這些技能又需要諸如膠片安裝、顯影、衝印和藥水調製等更加底層的技能來支持。你必須學會將感光材料的顯影過程程序化,以便在日後處理中獲得一緻的效果。第一次實驗課是設法識彆滑滑的顯影劑和刺鼻的定影液。
而要讓構圖更具創造性,則必須首先具備駕馭工具的能力。甚至在能力具備之前都不要去構思如何組織一張好照片。在工程領域,如同其他創造性藝術,必須學會分析以支持我們在各方麵的努力。那些有關鋼材、揚塵以及大量數學方法等方麵的知識,是計算構築物屬性時需要的,缺失瞭這些知識就無法構建美觀而實用的橋梁。同樣,未深入理解如何“預先視覺化”編程生成的工序,則無法構造齣卓越的計算機係統。
一些攝影師選擇8×10的黑白底片 ,而其他一些則選擇35mm的底片 。不同片幅類型的底片各有其優缺點。跟攝影一樣,編程也需要選擇稱心的語言。魔法編程語言Lisp屬於崇尚自由和靈活風格的程序員!Lisp最初的設想是作為理論輔助工具,用於遞歸理論及符號代數。時至今日,Lisp已發展成為一個軟件開發工具的大傢族,魅力獨特、功能強大且異常靈活,為軟件係統的快速原型設計提供瞭全方位支持。與其他編程語言一樣,技術社區開發齣龐大的抽象功能庫,Lisp則將這些功能連接起來。在Lisp的世界裏,程序是一等數據,以參數方式傳遞,以值的方式返迴,並存儲在數據結構中。這種靈活性極具價值,而最重要的是,其為形式化、命名以及精簡慣用法——工程設計中必不可少的常用使用模式,提供瞭機製保障。此外,Lisp程序能夠輕鬆操縱Lisp程序的錶述——一個開發龐大結構的程序綜閤 及分析工具(如交叉引用)的支持特性。
The Little LISPer一書以獨特方式闡述瞭Lisp創造性編程哲學裏的精髓技法。全書藉助大量實際訓練——掌握構建遞歸過程及操縱遞歸數據結構等技能所必要的實踐,相當巧妙地將知識組織起來,讓人絲毫感受不到學習的壓力。The Little LISPer一書對Lisp學習者的意義,不亞於哈農 手指練習或車爾尼 鋼琴研究對於鋼琴學生的意義。
傑拉德?傑伊?薩斯曼
劍橋(美國,馬薩諸塞州)
前言
為瞭給Scheme二十周年慶祝生日,我們第三次修訂瞭The Little LISPer,這次我們把書名改為更貼切的The Little Schemer,並增寫瞭姊妹篇:The Seasoned Schemer。
程序接受數據並産生數據。程序設計需要徹底理解數據;好的程序會反映齣所處理數據的結構。大多數的數據集閤,並由此延伸到大多數程序,都是可遞歸錶示的。遞歸是依據自身定義對象或解決問題的方法。
本書的目標是引導讀者學習遞歸思維模式。我們首先需要確定與遞歸概念搭檔的語言。這裏有三種相對明確的選擇:自然語言,如英語;形式化的數學語言;或者是編程語言。自然語言易産生歧義、不嚴謹且有時候拖遝冗長。這可能在人們日常交流時沒什麼問題,但對於簡明闡述遞歸這樣的嚴謹概念,這些特徵就容易齣問題。數學語言則與自然語言相反:其僅通過一些符號就能錶述強大的形式化概念。但很不幸,除非接受過數學專業訓練,否則一般人理解不瞭數學語言。技術與數學的結閤帶給瞭我們第三種選擇—幾乎是最理想的選擇:編程語言。我們相信編程語言是錶達遞歸概念的最佳方式。編程語言像數學那樣,具備將形式化含義賦予一係列符號的能力。但又不同於數學,可以直接體驗編程語言—可以運行本書中的程序,觀察其行為,然後修改它,再看看修改效果。
Scheme大概是用來講解遞歸概念的最佳編程語言。符號化是Scheme的天然特質—程序員不必過多考慮所用語言符號與計算機錶述形式之間的關聯。遞歸是Scheme的天然計算機製;主要的Scheme編程任務是創建(可能的)遞歸定義。Scheme程序主要用於交互—程序員可以立即運行代碼並觀察結果。此外,至本書結束時,我們收獲的最大感悟應該是:Scheme程序結構與程序所操縱數據之間是直接對應的 。
雖然Scheme程序可以以一種非常形式化的方式來描述,但理解Scheme並不需要特彆的數學知識。實際上,本書基於一個Scheme兩周“速成”介紹課程的講義整理而成,該課程針對那些沒有編程經驗且不喜歡數學的學生。這些學生中有許多人正準備從事公共事務方麵的工作。我們的信條是:用Scheme遞歸地編寫程序本質上是簡單的模式識彆(Pattern Recognition)。由於我們唯一關心的是遞歸編程,因此我們僅在Scheme的幾個招式上下功夫:car、cdr、cons、eq?、null?、zero?、add1、sub1、number?、and、or、quote、lambda、define以及cond。事實上,我們選擇瞭完美的Scheme編程語言—我們的程序纔能如此簡潔。
The Little Schemer和The Seasoned Schemer並未涉足應用編程領域,但掌握書中的概念則為你打開瞭理解計算本質的大門。
閱讀須知
你應該具備文字閱讀能力,識得數字,還要會數數。
緻謝
我們要感謝眾多貢獻者及他們為本書第二、三版提供的幫助。感謝Bruce Duba、Kent Dybvig、Chris Haynes、Eugene Kohibecker、Richard Salter、George Springer、Mitch Wand和David S. Wise的無數次討論,為全書內容構思提供瞭思路。感謝Ghassan Abbas、Charles Baker、David Boyer、Mike Dunn、Terry Falkenberg、Rob Friedman、John Gateley、Mayer Goldberg、Iqbal Khan、Julia Lawall、Jon Mendelsohn、John Nienart、Jeffrey D. Perotti、Ed Robertson、Anne Shpuntoff、Erich Smythe、Guy Steele、Todd Stein和Larry Weisselberg在草稿階段提供瞭許多重要意見。尤其感謝Bob Filman反復審核並提齣深刻而尖銳的批評。最後,感謝Nancy Garrett、Peg Fletcher和Bob Filman為設計與TeX排版做齣的貢獻。
最新的第4版受惠於Dorai Sitaram的Scheme排版程序—無比智能的SLATEX。Kent Dybvig的Chez Scheme讓Scheme編程變得非常愉快。真誠感謝Shelaswau Bushnell、Richard Cobbe、David Combs、Peter Drake、Kent Dybvig、Rob Friedman、Steve Ganz、Chris Haynes、Erik Hilsdale、Eugene Kohlbecker、Shriram Krishnamurthi、Julia Lawall、Suzanne Menzel Collin McCurdy、John Nienart、Jon Rossie、Jonathan Sobel、George Springer、Guy Steele、John David Stone、Vikram Subramaniam、Mitch Wand以及Melissa Wingard-Phillips的批評與建議。
讀者指南
閱讀本書切勿走馬觀花、一味圖快。請仔細閱讀,金玉珠璣分散在書中各個角落。本書很重要,重要的書至少讀三遍。閱讀時做到一步一個腳印。在未完全理解一章之前,不要嘗試跳到下一章。問題按難度遞增排序;解決不瞭早先的問題,後麵的問題則將更難迴答。
本書以對話方式組織內容,涉及Scheme程序的樣例趣談時,對話將在你(讀者)和我們(作者)之間進行。請盡可能動手試驗閱讀到的樣例代碼。獲取Scheme是一件很容易的事。盡管在不同Scheme實現之間存在微小語法差異(主要是特殊名稱和特定函數方麵的拼寫),但Scheme語法基本上是一緻的。接下來要玩轉Scheme,還得定義本書引入的atom?、sub1和add1:
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
試一試(atom? (quote ())),看看其是否返迴#f,以驗證Scheme正確定義瞭atom?。實際上,該概念同樣適用於諸如Common Lisp這樣的現代Lisp方言。在Lisp中要以函數方式定義atom?:
(defun atom? (x)
(not (listp x)))
此外,你可能還需要對書中的程序進行稍加修改。典型的,隻是做個彆變化。框格注釋 會給齣程序試驗的建議。“S:”打頭的注釋代錶Scheme相關內容,“L:”打頭的注釋代錶Common Lisp相關內容。
第4章我們會通過3個運算函數:add1、sub1和zero?來開發一個基本的算術程序。由於Scheme並未提供add1和sub1,因此需要藉助內建的加減基本元件來定義它們。進一步的,為瞭避免衝突,程序的加減法必須以不同的符號:+和—來分彆實現 。
本書不涉及任何形式化定義。我們相信你可以構建自己的定義,並因而記住及理解這些定義,這樣的效果比我們一口口喂給你吃要好。但在你齣山之前,需確保自己徹底理解瞭Scheme的五法十誡 。學習Scheme的鑰匙是“模式識彆”。Scheme十誡心法指齣瞭具體模式。在本書的早期,一些概念齣於簡單起見講解得比較淺顯;但隨著內容的深入,將適時展開描述。你應該也知道,雖然全書講的是Scheme,但Scheme自身應用的廣泛性,可不是我們用介紹性文字就能夠清晰闡述的。在掌握瞭本書內容之後,就可以著手閱讀與理解更加全麵且高級的其他Scheme書籍瞭。
我們的大量示例都跟食物有關,這裏有兩個原因。首先,食物比抽象符號更形象(你如果正在節食,顯然不適閤讀這本書,開玩笑)。我們希望各種食物能夠幫助你理解示例及相關概念。其次,我們打算亂一下你的心智。我們知道學習之路總是充滿各種沮喪,一點點障礙將有助你保持清醒。
你可以整裝待發瞭。祝你好運!希望你好好享受荊棘旅程中的激情挑戰。
祝你胃口大開!
丹尼爾?弗裏德曼
馬提亞?費雷森
The Little Schemer:遞歸與函數式的奧妙 下載 mobi epub pdf txt 電子書 格式