學習函數式編程的入門好書
用一種更優雅、更高效的方式開發高性能的並發軟件
《Elixir 程序設計》作者就是15 年前編寫瞭Programming Ruby,將Ruby 帶入大眾視野的Dave Thomas。這一次他延續瞭一貫的寫作風格,以一個擁有麵嚮對象的開發經曆但並未接觸過函數式編程的開發者的角度切入,循序漸進地帶領讀者進入 Elixir 的奇妙世界。通過一步步的實驗探索,引導讀者逐步跳齣已有的編程思維模式,以全新的函數式編程方式來思考及尋找解決實際問題的辦法。然而本書並不像Programming Ruby 那樣麵麵俱到,而是給讀者講述基本的Elixir 語法和編程思想,同時提供許多有用的資源,啓發讀者繼續深入探索。這也是學習一門新語言的樂趣所在。
如果你對函數式編程有興趣,或者你正在苦苦尋求一種高效的並發編程的方法,Elixir 可以作為入門之選,值得一試。
Dave Thomas 再一次做到瞭:《Elixir 程序設計》成為瞭每本編程書籍都渴望與之比肩的目標。它不是簡單地教授語法和舉幾個刻闆的例子,而是引導你如何以Elixir 的方式思考。
——Bruce Tate
icanmakeitbetter.com公司CTO,技術作傢
在《Elixir 程序設計》裏,David 齣色地介紹瞭函數式編程,他以一種有趣、實用、充滿靈感的方式教我們重新思考如何用不同的方法來設計程序。隨著閱讀的深入,你會不時會心一笑,因為你發現 Elixir 的某方麵可以讓你用一種新的、更優雅的方式來解決問題,而且這種方式非常自然和直觀,我們這些編程人員必須馬上應用起來纔行。
這本書詳細地介紹瞭 Elixir 及其工具,旨在使開發過程更加流暢和富有成效。Dave 解釋瞭 Erlang 運行時係統的核心部件,如分布式、並發和容錯,它們為 Elixir 提供瞭編寫可擴展、適應性強的應用程序的能力。
——Alexei Sholik
順序編程的時代已經過去,如今高性能、可擴展和容錯的軟件都是並發的。Elixir 是這個全新世界裏的關鍵角色,它將 Erlang 和 OTP 的能力帶給更廣泛的受眾。閱讀本書吧,為迎接軟件開發新時代開個好頭。
——Paul Butcher
《七周七並發模型》的作者
就像鎬頭書之於 Ruby,這本書是 Elixir 的事實標準。Dave 以他無可挑剔的風格,全麵介紹瞭Elixir 語言的各方麵,包括數據結構、宏、OTP,甚至 Dialyzer。閱讀本書是一種享受,因為它帶領讀者學習 Elixir,並帶領他們參與編寫函數式程序的整個思維過程。
如果你想快速掌握 Elixir 語言,《Elixir 程序設計》是你的優先選擇。
——Jim Freeze
首屆世界Elixir 會議的組織者
這無疑將成為 Elixir 的鎬頭書。……Dave 很興奮地帶領讀者進入迷人的 Elixir 世界。對於對 Elixir 感興趣的每一位程序員而言,本書值得擁有。
——Dan Kozlowski
《Elixir 程序設計》是Dave Thomas 的另一佳作。在此之前我嘗試的幾個函數式編程語言都讓我備受挫摺。你能感覺到Dave 的熱情和在每一章節使用該語言時的喜悅。他會讓你以從未想到過的方式來思考解決問題的辦法。這本書讓我徹底改變瞭在思考各種語言編程的改進時的方式。
——Richard Bishop
我真的很享受閱讀這本書。它不隻是一股腦兒地介紹一些語法或特性;總的來說,我認為它對 Elixir 和函數式編程做瞭非常周到的介紹。
——Cody Russe
第1 章 接受現實 1
編程時應該關注數據轉換 1
藉助管道來組閤轉換 2
函數是數據轉換器 3
安裝 Elixir 3
運行 Elixir 4
iex—交互式 Elixir 4
編譯和運行 8
對閱讀本書的建議 9
練習 9
換一種方式思考 10
第一部分 常規編程
第2 章 模式匹配 12
賦值:並非如你所料 12
更復雜的匹配 13
輪到你瞭15
用_(下畫綫)忽略匹配值 15
每次匹配變量僅綁定一次 15
輪到你瞭17
從另一個角度來看等號 17
第3 章 不可變性 18
你已經擁有瞭(一些)不可變數據 18
不可變的數據纔是已知的 19
不可變性對性能的影響 20
復製數據20
垃圾迴收20
用不可變數據編寫程序 21
第4 章 Elixir 基礎 22
內置類型 22
值類型 23
整數 23
浮點數 23
原子 24
區間 24
正則錶達式 24
係統類型 25
PID 和端口 25
引用 25
收集類型 26
元組 26
列錶 27
散列錶 28
二進製型29
命名、源文件、約定、運算符和其他 30
真值 30
運算符 31
小結 32
第5 章 匿名函數 33
函數和模式匹配 34
輪到你瞭35
一個函數,多個函數體 35
編寫更長的代碼 36
輪到你瞭37
能返迴函數的函數 37
記住原始環境的函數 38
參數化函數 39
輪到你瞭39
將函數作為參數來傳遞 40
& 運算符 40
輪到你瞭42
函數是核心 42
第6 章 模塊與命名函數 43
編譯模塊 43
函數體是代碼塊 44
輪到你瞭45
函數調用與模式匹配 45
輪到你瞭48
哨兵子句 48
哨兵子句的限製 49
默認參數 50
輪到你瞭53
私有函數 53
|> ——美妙的管道運算符 54
模塊 55
模塊指令57
import 指令 57
alias 指令 58
require 指令 58
模塊屬性 58
模塊名:Elixir、Erlang 和原子類型 59
調用 Erlang 的庫函數 60
尋找函數庫 60
輪到你瞭61
第7 章 列錶與遞歸 62
頭部和尾部 62
使用頭部和尾部來處理列錶 63
iex 如何顯示列錶 64
使用頭部和尾部來構造列錶 66
創建映射函數 67
在遞歸過程中跟蹤值 68
輪到你瞭69
生成求和函數 69
輪到你瞭70
更復雜的列錶模式 71
列錶的列錶 71
輪到你瞭74
List 模塊實戰 75
與列錶友好相處 76
第8 章 字典:散列錶、散列字典、關鍵字列錶、集閤與結構體 77
如何在散列錶、散列字典和關鍵字列錶之間做選擇 77
字典 78
模式匹配和更新散列錶 79
模式匹配不能綁定鍵 81
更新散列錶 82
散列錶與結構體 82
訪問結構體的另一種方式 84
嵌套字典結構 85
嵌套訪問器和非結構體 86
動態(運行時)嵌套訪問器 87
集閤 88
能力越大,誘惑越大 89
第9 章 番外篇—類型是什麼 90
第10 章 處理收集—Enum 與Stream 92
Enum——處理收集 92
關於排序的說明 95
輪到你瞭96
Stream——延遲處理的枚舉類型 96
流是可組閤的枚舉器 97
無限流 99
自定義流99
流在實際中的應用 104
Collectable 協議 104
推導式 105
推導式也可以處理二進製位 106
作用域與推導式 107
推導式的返迴值 107
輪到你瞭108
感動過往的神 109
第11 章 字符串與二進製型 110
字符串字麵量 110
Heredoc 111
魔術符 112
“字符串”這個名稱 113
單引號字符串——字符編碼列錶 114
輪到你瞭116
二進製型 117
雙引號字符串是二進製型 118
字符串與Elixir 庫 118
輪到你瞭124
二進製型與模式匹配 124
用二進製型來處理字符串 124
輪到你瞭125
熟悉卻又陌生 126
第12 章 控製流 127
if 與 unless 127
cond 128
case 131
拋齣異常 133
包含異常的設計 133
四兩撥韆斤 134
輪到你瞭134
第13 章 組織項目 136
項目:從 GitHub 獲取 issue 136
我們的代碼將如何工作 137
任務:用mix 來創建我們的新項目 137
創建項目樹 138
轉換:解析命令行 140
進階:編寫一些基本的測試 142
輪到你瞭144
轉換:從 GitHub 獲取數據 144
任務:使用外部庫 145
尋找庫 146
為項目添加庫 146
輪到你瞭148
迴到轉換148
轉換:轉換響應內容 151
不在 hex 裏的依賴項 152
應用程序配置 152
轉換:為數據排序 153
轉換:取前n 條 155
輪到你瞭156
轉換:格式化錶格 156
任務:創建命令行可執行程序 159
任務:添加日誌 161
任務:測試代碼注釋 163
任務:創建項目文檔 167
使用轉換數據的方法來編寫代碼 169
輪到你瞭170
第14 章 運用多進程 172
簡單的進程 173
在進程間發送消息 174
處理多條消息 175
遞歸、循環與棧 178
進程開銷 178
輪到你瞭181
進程何時結束 182
關聯兩個進程 183
監控進程185
輪到你瞭186
並行map——Erlang 版本的“Hello, World” 186
輪到你瞭187
斐波那契數服務器 188
任務調度器 189
輪到你瞭192
代理——一個難題 192
以進程的方式來思考 194
第15 章 節點——分布式服務的關鍵 195
命名節點 195
輪到你瞭197
節點、cookie 與安全 198
給你的進程命名 199
何時給進程命名 202
輪到你瞭202
I/O、PID 與節點 203
輪到你瞭204
節點是分布式的基礎 205
第16 章 OTP:服務器 206
一些 OTP 的定義 206
OTP 服務器 207
狀態和單個服務器 207
我們的第一個 OTP 服務器 208
輪到你瞭210
單嚮調用210
跟蹤服務器的執行情況 212
輪到你瞭214
GenServer 迴調函數 214
給進程命名 216
整理接口 217
輪到你瞭218
第17 章 OTP:應用程序監視器 220
應用程序監視器與工作進程 220
輪到你瞭223
管理重啓前後的進程狀態 223
應用程序監視器是可靠性的核心 229
輪到你瞭229
第18 章 OTP:應用程序 230
這不是傳統的應用程序 230
應用程序規範文件 231
將Sequence 程序轉變為OTP 應用程序 231
關於應用參數的更多信息 234
監視是可靠性的基礎 234
輪到你瞭235
熱代碼交換 235
OTP 很大——難以置信的大 241
輪到你瞭241
第19 章 任務與代理 242
任務 242
任務與監視 243
代理 244
更大的例子 246
使其分布式運行 248
使用代理與任務,還是GenServer 249
第三部分 更高級的Elixir
第20 章 宏與代碼求值 252
實現if 語句 252
宏注入代碼 254
裝載次序255
quote 函數 256
將內部錶示作為代碼使用 256
unquote 函數 258
展開列錶——unquote_splicing 259
迴到我們的myif 宏 260
輪到你瞭261
使用綁定來注入值 261
宏是衛生的 263
執行代碼片段的其他方法 264
宏與運算符 265
深入研究 266
更進一步 266
輪到你瞭267
第21 章 連接多個模塊:行為與use 268
行為 268
定義行為268
聲明行為269
use 與 __using__ 270
放到一起——跟蹤方法調用 270
使用use 275
輪到你瞭275
第22 章 協議——多態函數 277
定義協議 277
實現協議 278
可用的類型 279
輪到你瞭280
協議和結構體 280
內置協議:Access 281
內置協議:Enumerable 282
內置協議:String.Chars 285
內置協議:Inspect 286
協議就是多態 288
輪到你瞭288
第23 章 更酷的玩意兒 290
自定義魔術符 290
獲取選項292
輪到你瞭293
多應用的 umbrella 項目 294
創建 umbrella 項目 295
創建子項目 295
LineSigil 項目 296
Evaluator 項目 296
連接子項目 297
彆急!還有更多炫酷的玩意兒! 299
附錄A 異常:raise 與try,catch 與throw 300
附錄B 類型規範與類型檢查 306
推薦序
最開始杜萬說請我為他翻譯的Elixir 的新書寫一篇序,我一頭霧水,因為完全沒有聽說過“Elixir”這個詞,我甚至到現在都不知道這個單詞應該怎麼讀,雖然我已經讀完瞭全書。是的,剛纔那個句子很長,不好讀,然而它的邏輯是正確的。這跟我初步瞭解Elixir 的感覺差不多,不好理解,但邏輯是正確的。
雖然我現在很少寫代碼瞭,但是作為一個曾經寫瞭十幾年代碼的人,本書講述的內容,特彆是Elixir 的思想很是讓我震撼。我必須承認我並沒有徹底理解這本書,很多的細節沒有時間去詳細實踐,但就我不深的理解,已經體會到瞭這種基於進程的編程思想,以及它帶來的變革。
在我中學開始學習編程的時候,用的是 Pascal。我知道數據結構、算法,我會做題,然而我對軟件工程一無所知,不知道如何編寫一個完整的應用。後來大學的時候學習Java,纔知道 Pascal 是一種麵嚮過程的語言,Java 是麵嚮對象的語言。然而我花瞭很久纔理解瞭什麼叫作“對象”,以及什麼叫作麵嚮對象的編程。我清晰地記得 Java 課的第一次作業是編寫一個計算器程序。整個程序我隻有一個 Java 文件,所有的代碼都在這個文件中,活生生用 Java 語言寫瞭一個 Pascal 程序。
編程思想的轉變是睏難的。我在讀這本書的時候,再一次感受到瞭編程思想的轉變,從麵嚮對象到麵嚮進程。原本在 Java 中非常復雜的多綫程、分布式處理方式在 Elixir 中變得無比簡單,這也是 Elixir 在現代 IT 係統中的價值:最大化CPU 的處理能力。
大概一年前,我有一個朋友說他最近在瘋狂地研究 Erlang(一種跟 Elixir 接近的語言),他打算說服公司的領導用 Erlang 重做一個係統。當時我覺得他瘋瞭,我對 Erlang不瞭解,隻知道這是一種很奇怪、很小眾的編程語言,現在我可以理解那個朋友當時的想法瞭,他一定有一種腦洞大開的感覺!
不論你現在是做 APP 開發,傳統 Web 開發,還是在中國大紅大紫的微信開發,都應該讀一讀此書,它一定會讓你眼前一亮。沒有最好的編程語言,隻有最閤適的編程語言。隨著硬件的不斷發展,一定會有很多不同於過去常見的編程思想和語言齣現,以適應最新的硬件。也許本書的內容不能在你的工作中用到,但這不重要,重要的是思想的碰撞帶來的愉悅,以及碰撞後留下的那些思考。
張海龍,Coding CEO
2016 年1 月19 日·深圳
譯者序
還記得第一次得知 Elixir 是 Coding 的冒泡1上 mingshun2 的一句牢騷:“不要咖啡,不要大象,不要蟒蛇,不要紅寶石,隻要萬金油”。這句開發者的嘮叨,吸引瞭我的注意。顯然咖啡錶示 Java,蟒蛇錶示 Python,紅寶石錶示 Ruby,大象呢?“最好的編程語言,PHP”,一個同事提示道。Google 搜索瞭一下,果然 PHP 的 logo 是一頭大象。“那麼萬金油呢?”我追問道。同事也一副“什麼鬼”的錶情,湊過來一起Google 瞭一番,纔知道萬金油是 Erlang 虛擬機上的一門語言,相當於 Scala 之於 Java 虛擬機,英文名字叫Elixir。這是一門全新的語言,有一些新奇的特性,於我小有觸動。
後來從 mingshun 那裏瞭解到Programming Elixir 寫得不錯,國內還沒有翻譯版本。於是我就開始張羅和 mingshun 閤作翻譯。先找博文視點的編輯許艷與外方談妥瞭翻譯版權,試譯兩章,然後很快簽瞭閤同開始動工。
初稿階段比較順利,我們把每一章編寫成獨立 Markdown 文件,還寫瞭一個腳本,把Markdown 格式自動轉換成 Word 格式。我們把譯稿放在 Coding 的代碼倉庫裏,每譯完一章就提交一個閤並請求給另一個 Peer Review。
排版以後就沒那麼順暢瞭,新發現的問題標注在PDF 文件上,一個人先審,另一個人候著,不容易並行執行。之前瞭解過原書齣版社 Pragmatic Bookshelf 有一套工具可以由源文件生成多種格式的目標文件。有瞭這套工具寫書就像寫代碼,一次編寫,無須排版。
寫瞭封郵件嚮 Pragmatic Bookshelf 齣版社問詢,對方稱暫時沒有對譯者開放工具。此時深感工具之重要,對於創作和翻譯而言,工具就是生産力。寫代碼也一樣,良好的工具鏈可以極大地提高生産效率,這也是 Coding 推齣的一係列雲端開發工具的價值所在。
在翻譯的過程中得到瞭很多人的幫助,首先要感謝閤譯者黃明信,是你把 Elixir 這麼美妙的語言帶給瞭我,感謝你一次次在翻譯過程中幫我解惑,幫我字斟句酌;感謝責任編輯許艷,感謝你在整個過程的付齣,感謝你細緻地審稿,從一次次反饋中感受到瞭你編輯工作的嚴謹;感謝同事楊臻,在一些拿捏不準的地方,幫我提瞭許多建議;感謝所有幫助過我的人。
杜萬
2015 年 1 月 3 日於上海
遇見 Elixir 可能是一種緣分吧!我比較喜歡管它叫“萬金油”,但並不代錶它就是萬能的,畢竟世界上沒有完美的東西。Elixir 繼承瞭 Erlang 在構建分布式係統上的優點,並通過添加眾多現代編程語言的特性來提升語言的錶達能力。如果說 Erlang 是並發編程的領路者,那麼 Elixir 就是你一路跑來在沿途看到的美好風景,它會讓你的編碼旅程更精彩。
翻譯這本書是為瞭讓更多人能瞭解 Elixir。無論你是否會在項目中使用它,都值得你去“玩”一下,體驗一下新思維。現代編程語言的實用性不局限於它的運行效率,還體現在語言的錶達能力及對基礎設施的抽象能力上。在我看來,寫代碼如同文學創作,不僅要把你的想法準確地傳達給機器,更重要的是讓讀代碼的人有種清風撲麵而來的快感。
這本書與Programming Ruby 是同一位作者,他的寫作風格是技術作者中少有的,措辭生動,引經據典,頗富文采,奈何中西文化有彆,本人又纔疏學淺,未能將原作者的想法傳神地錶達齣來。希望各位讀者多多包涵。
非常感謝在翻譯過程幫助過我的同事們,特彆是本書的另一位譯者,杜萬。由於是第一次翻譯,很多工作都不懂如何開展,加上又是個急性子,經常會為些小事情發牢騷。感謝他對我的包容,每當想放棄的時候他都在一旁鼓勵。同時還要感謝齣版社的工作人員,正因為他們在整個過程中的辛勞付齣,本書纔得以順利齣版。
黃明信
2015 年 1 月 4 日於湛江
我一直都在尋找能夠幫助我提升代碼質量和可維護性的書籍,而《Elixir 程序設計》在這方麵做得非常齣色。它在介紹 Elixir 的一些進階特性時,比如宏(Macros)和行為(Behaviors),並沒有迴避其復雜性,而是用一種循序漸進的方式,讓我逐漸理解其強大之處。我特彆喜歡書中關於如何利用宏來減少代碼重復,以及如何編寫可復用的行為來簡化通用任務的討論。書中提供的單元測試和集成測試的示例,也讓我意識到瞭測試的重要性,並學會瞭如何為自己的 Elixir 代碼編寫健壯的測試用例。我嘗試著將書中介紹的一些測試技巧應用到我自己的小項目中,發現代碼的魯棒性確實有瞭顯著的提升。這本書不僅僅是教我如何寫齣能工作的代碼,更是教我如何寫齣優雅、易讀、易於維護的代碼,這對於任何一個認真的開發者來說,都是極其寶貴的財富。
評分這本書給我最深刻的印象是它對 Elixir 生態係統的全麵介紹。它不僅僅停留在 Elixir 語言本身,而是將注意力延伸到瞭圍繞 Elixir 構建的強大工具和庫。我之前對 Hex(Elixir 的包管理器)和 Mix(Elixir 的構建工具)這些概念瞭解不多,但通過這本書,我不僅學會瞭如何安裝和使用它們,還瞭解瞭它們在項目開發中的重要作用。書中對 Phoenix 框架的介紹,更是讓我看到瞭 Elixir 在 Web 開發領域的巨大潛力。我試著跟隨書中的步驟搭建瞭一個簡單的 Phoenix 應用,那種快速開發 Web 應用的體驗讓我感到非常興奮。這本書讓我意識到,Elixir 的魅力不僅僅在於語言本身,更在於它所擁有的一個蓬勃發展、充滿活力的社區和豐富的生態係統。這讓我對接下來的 Elixir 學習和項目開發充滿瞭期待。
評分哇,拿到這本《Elixir 程序設計》真是讓我驚喜連連!我一直對函數式編程和 Elixir 的並發模型很感興趣,但又擔心會陷入理論的海洋而無法實際操作。這本書的齣現,簡直就是我一直渴望的“實踐指南”。它並沒有一上來就拋齣晦澀難懂的概念,而是從最基礎的語法和數據結構開始,一步一步地引導我上手。我特彆喜歡它在介紹變量、函數和模塊時,都會穿插一些非常貼近實際應用的小例子。比如,在講解如何定義函數時,書中就提供瞭一個計算斐波那契數列的例子,不僅代碼清晰易懂,而且還解釋瞭為什麼這種遞歸的寫法在 Elixir 中會如此高效。我試著自己修改瞭一下參數,運行瞭一下,看到結果瞬間齣現,那種感覺真的太棒瞭!而且,書中的圖示和流程圖也幫我更好地理解瞭 Elixir 的核心概念,比如它對不可變性的強調,以及如何通過模式匹配來處理不同的數據。讀這本書就像是在和一位經驗豐富的導師對話,他總能在你迷茫的時候給你指明方嚮,讓你在學習的道路上充滿信心。即使是對編程新手來說,這本書也能讓你快速建立起對 Elixir 的初步認知,並為後續深入學習打下堅實的基礎。
評分這本書在講解 Elixir 的並發和分布式特性時,簡直讓我大開眼界!我一直以為並發編程是個非常復雜且難以掌握的領域,但《Elixir 程序設計》用一種非常直觀的方式,將 Actor 模型和 OTP(Open Telecom Platform)的強大之處展現在我麵前。書中對進程(Process)的解釋,以及它們如何通過消息傳遞進行通信,讓我對並行計算有瞭全新的認識。我特彆欣賞作者對於 Supervisor 和 GenServer 的詳細講解,以及如何利用它們來構建容錯和可伸縮的係統。書中提供的實際代碼示例,比如構建一個簡單的聊天服務器,讓我有機會親手實踐這些概念。當我成功地讓多個客戶端連接到服務器,並能夠相互發送消息時,那種成就感是無與倫比的。這本書不僅僅是理論的堆砌,更重要的是它教會瞭我如何將這些強大的工具應用到實際項目中,解決現實世界中的問題。我對 Elixir 的信心也因此倍增,覺得它在構建高可用、高性能的應用方麵有著巨大的潛力。
評分《Elixir 程序設計》這本書給我帶來的最直觀的感受是,它有效地降低瞭我學習一門新語言的門檻,並且讓我能夠快速地建立起對這門語言的信心。它並沒有采取“先學理論,再做實踐”的模式,而是將理論知識巧妙地融入到實際的代碼示例和練習中。我尤其喜歡書中關於函數式編程思維的講解,它讓我明白瞭函數式編程的優勢,以及如何在 Elixir 中寫齣更具聲明性和更易於推理的代碼。書中的一些“小竅門”和“最佳實踐”也非常實用,能夠幫助我避免一些常見的陷阱,並寫齣更高效、更健壯的代碼。即使是在遇到一些比較睏難的概念時,書中的解釋也足夠清晰,讓我能夠反復琢磨,最終理解。這本書就像是一位經驗豐富的嚮導,在我探索 Elixir 的世界時,為我指明瞭方嚮,讓我少走瞭很多彎路,也讓我對這門語言産生瞭濃厚的興趣。
評分內容還是不錯的,價格有點高。
評分不錯~~~~~~~~
評分盡量瞭解多幾種語言吧
評分翻譯的很用心,遇到譯者,說前前後後忙瞭一年,纔掙3000,太慘瞭!
評分書還不錯
評分之前聽有人說京東的圖書是盜版書,但是買這些本全都是正版的,紙張質量很好,值得擁有
評分好
評分正在讀,非常好的語言,值得推廣
評分可惜這本書丟瞭,這一次買的應該是正版。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.tinynews.org All Rights Reserved. 静思书屋 版权所有