Elixir 簡明筆記(一)--- 初識

Elixir雌澄,中文可以翻譯為“靈丹妙藥”倚喂。一門運行在 Erlang 虛擬機上的新語言每篷,稱自己為靈丹妙藥,可見其霸氣。Elixir 嘗鮮之后焦读,發(fā)現(xiàn)確實是一門博采眾長的新語言子库。下面進行 Elixir 的簡單介紹。

安裝 Elixr

安裝 elixir 相當方便矗晃,官方文檔給出了不同平臺的方法仑嗅。由于 elixir 是運行在 erlang 虛擬機上的,因此需要安裝 erlang喧兄。下面介紹在 MacOS 下的安裝方法无畔。如果有 homebrew,安裝只需要兩條命令吠冤。

  • 安裝 erlang

      brew install erlang
    
  • 安裝 elixir

      brew install elixir
    

打開 Terminal, 輸入

    elixir -v

可以獲取安裝的版本號浑彰,目前最新的是 1.0.2版本

Hello World

Elixir 自帶了一個交互解釋器,就像Python那樣可以直接輸入代碼就執(zhí)行拯辙,也類似 Ruby 的IRB眯分。這個交互解釋器為 IEX吁脱。在 Terminal里面直接輸入 iex思币,就可以進入elixir交互環(huán)境钞诡,按住control+z退出,或者連續(xù)安兩次control+c夕春。

進入 iex未荒,會看到下面的樣式:

Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.0.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>

輸入 "Hello World", elixir 用雙引號來表示字符串。

> "Hello world"
"Hello world"
>

可以用 <> 連接字符串

> "hello" <> " " <> "elixir"
"hello elixir"
>

字符串支持多行及志,敲回車就可以跳下一行片排,直到遇到結(jié)束的雙引號。不需要在前面留白速侈,相當贊的功能率寡。

> "I
> like
> elixir"
"I\nlike\nelixir"
>

基本運算

計算機本來就是用來做計算的,elixir當然也可以做計算倚搬,以及定義函數(shù)運算冶共。elixir支持常見的數(shù)學運算。

> 1 + 1
2
> 2 * 3
6
> 10 / 2
5.0
> 10 / 3
3.3333333333333335
> 10 / 3.0
3.3333333333333335
> 3 * (1 + 2) 
9

注意每界,elixir的除法總是返回浮點類型捅僵,例如上面的 10 / 2返回的是 5.0而不是5。如果你想進行整型除法眨层,或者求余數(shù)命咐,可以使用divrem函數(shù)。elixir的函數(shù)調(diào)用時候的括號是可以省略的谐岁,畢竟語言的作者是 rails 的核心成員,具有濃厚的 ruby 風格。

> div(10, 2)
5
> rem 10, 3
1

匿名函數(shù)

elixir 可以定義匿名函數(shù)伊佃,并且匿名函數(shù)可以匹配某個變量窜司,通過變量調(diào)用匿名函數(shù)。定義匿名函數(shù)的關(guān)鍵字是 fnend航揉。

> sum = fn x, y -> x + y end
#Function<12.90072148/2 in :erl_eval.expr/5>
> sum.(10, 9)
19

elixir是函數(shù)式范式編程語言塞祈,函數(shù)貴為一等公民。既可以直接調(diào)用帅涂,也可以當參數(shù)傳入议薪。匿名函數(shù)是閉包,因此它們可以訪問當前作用域(scope)內(nèi)的其它變量媳友。并且elixir也可以定義像js那種立即執(zhí)行的匿名函數(shù)

> x = 9
> (fn x -> x + 1 end).(x)
10
> x
9

基本數(shù)據(jù)類型

前面我們嘗試了elixir的簡單例子斯议,其中發(fā)現(xiàn)了=這個符號,在數(shù)學里這個是等號醇锚,表示左右兩邊相當哼御,學過編程的人都知道,程序里的=不是等號焊唬,而是賦值號恋昼,指把右邊的表達式或數(shù)值賦給左邊的變量。elixir與別的語言不一樣赶促,=不能稱之為賦值號液肌,而是匹配運算符,elixir稱之為模式匹配(pattern match)鸥滨。后面我們再做解釋嗦哆。

前面我們見識了elixir的基本數(shù)據(jù)類型中的數(shù)字相關(guān)的類型。elixir的基本數(shù)據(jù)類型包括下面的幾種:

  • 布爾(boolean)
  • 數(shù)字(number)
    • 整型(integer)
    • 浮點(float)
  • 原子(atom)
  • 字符串(string)
  • 匿名函數(shù)(anonymous function)
  • 列表(list)
  • 元組(tuple)

布爾類型

elixir 用 truefalse來表示布爾類型爵赵。對于判斷類型吝秕,python提供了一個 type函數(shù)相當方便,可惜elixir并沒有這樣的type函數(shù)空幻。不過elixir提供了不同的函數(shù)烁峭,用來判斷類型,例如判斷是否是布爾類型的is_boolean函數(shù)秕铛。

> is_boolean(true)
true
> is_boolean(false)
true
> is_boolean(1)
false
> is_number(1)
true

注意约郁,1 是數(shù)字類型,并不是布爾類型但两,當然在條件判斷的時候鬓梅,1 可以布爾值可以是true。后面會提到谨湘。

函數(shù)表示方法

elixir的文檔工作做得也很好绽快,對于語言的概念的描述和應(yīng)用芥丧,也有自己的一套。例如函數(shù)的描述方法通常為 `<函數(shù)名>/<元數(shù)>`(<function name>/<arity>)坊罢。上面的判斷類型函數(shù)可以描述為 `is_boolean/1`, `is_number/1`续担。元數(shù)可以理解為函數(shù)的參數(shù)。這個描述的好處在于活孩,可以用幫助函數(shù) `h` 來查看一個函數(shù)的文檔和使用方法物遇。類似python里的 `help` 函數(shù)。

使用 h 查看 is_boolean/1憾儒。

> h is_boolean
                    def is_boolean(term)

Returns true if term is either the atom true or the atom false (i.e. aboolean); otherwise returns false.

Allowed in guard tests. Inlined by the compiler.

>

配合模塊的文檔和函數(shù)的文檔询兴,能過構(gòu)建文檔完善的程序,這一點充分借鑒了Python的文檔字符串設(shè)計起趾。

原子

原子(atom)是一種常量诗舰,變量名就是它的值。ruby阳掐、lisp 中稱其為符號(symbol)始衅。定義十分簡單,只需要在字符前加上:符號缭保。

> :atom
:atom
> :hello
:hello
> :123
** (SyntaxError) iex:29: invalid token: :123

注意汛闸,大寫字母開頭的"變量",其實是一種原子艺骂,是:Elixir.變量名的別名诸老。模塊通常是用大小字母開頭的,后面會用到钳恕。

> Hello
Hello
> Hello == :hello
false
> Hello == :Elixir.Hello
true

列表

列表是常用的數(shù)據(jù)類型别伏,很多語言都支持列表或者數(shù)組的結(jié)構(gòu)。elixir的列表稍微有點不同忧额。

列表的聲明可以使用一對方括號[]厘肮,列表的元素可以是任意的數(shù)據(jù)類型。通過++或者--可以拼接列表和消除列表

> list = [1, 2, true, 3]
[1, 2, true, 3]
> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
> [1, 2, 3, 11, 22, 33, 33, 22, 11] -- [11, 22, 33]
[1, 2, 3, 33, 22, 11]

列表相減的時候睦番,是按照元素位置進行匹配的类茂。想要獲取列表的長度,也就是元素的個數(shù)托嚣,可以通過函數(shù) lenght 得到巩检,通過 hd 函數(shù),可以獲得列表的第一個元素示启,tl函數(shù)則獲取除第一個元素的剩余列表元素兢哭。這個操作在遞歸的時候很有用。當列表為空的時候夫嗓,hd 和 tl 都會報錯迟螺。

> list = [1, 2, 3, 4]
[1, 2, 3, 4]
> length list
4
> hd list
1
> tl list
[2, 3, 4]

列表在內(nèi)存中是以鏈表的形式存儲的冲秽,一個元素指向下一個元素,然后再下一個...直到到達列表末尾煮仇。我們稱這樣的一對(元素值+指向下一個元素的指針)為列表的一個單元(cons cell)劳跃。 由于列表的存儲結(jié)構(gòu),獲取列表的元素浙垫,都需要遍歷列表,獲取列表的長度是一個線性操作郑诺。我們必須遍歷完整個列表才能知道它的長度而給列表刪除和插入元素則相當高效夹姥。

|這個操作符可以拼接列表,指在列表前置一個列表辙诞。事實上辙售,列表的定義,就是單個列表元素拼接起來的飞涂,寫出中括號的方式只是語法糖罷了旦部。

> list = [3, 4, 5]
[3, 4, 5]
> [3| [4| [5| []]]]
[3, 4, 5]
> [1 | list]
[1, 3, 4, 5]
> [[1, 2] | list]
[[1, 2], 3, 4, 5]
> [1, 2 | list]
[1, 2, 3, 4, 5]
> list = [3|[]]

元組

elixir 的列表是鏈式存儲的,而元組則是連續(xù)存儲的较店,因此可以通過所以的方式訪問元組士八。當然,修改元組梁呈,比如插入刪除元素則開銷很大婚度。元組的作用很大,通過用來存儲一些不容易變的數(shù)據(jù)官卡。

元組的聲明很簡單蝗茁,只需要一對花括號{},里面的類型也可以是任意類型寻咒∠蹋可以用 elem函數(shù)和索引訪問元組。

> t = {1, :ok, "hello"}
{1, :ok, "hello"}
> elem t, 1
:ok

更多的元組操作毛秘,會在后面的內(nèi)容提及饭寺。

字符列表

字符串是用雙引號定義的,單引號則定義的是字符串列表熔脂,可以使用列表的一些函數(shù)操作佩研。

> 'hello'
'hello'
> list_str = 'hello'
'hello'
> is_list list_str
true
> 'hello' ++ 'world'
'helloworld'

Enjoy Elixir

這樣就把elixir的基本東西快速瞥了一遍。具體每個數(shù)據(jù)類型的深入了解和運用霞揉,以及強大的函數(shù)旬薯、模塊、宏等概念將會陸續(xù)介紹适秩。

學習Elixir的時候绊序,收獲最大的則是《Elixir Programe》這本書硕舆。并且也按照自己的理解做了一些基礎(chǔ)的翻譯(github地址),這些筆記就是在翻譯學習之后自己的總結(jié)骤公。有興趣的童鞋可以參考抚官,或者幫忙修正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阶捆,一起剝皮案震驚了整個濱河市凌节,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洒试,老刑警劉巖倍奢,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異垒棋,居然都是意外死亡卒煞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門叼架,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畔裕,“玉大人,你說我怎么就攤上這事乖订“缛模” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵垢粮,是天一觀的道長贴届。 經(jīng)常有香客問我,道長蜡吧,這世上最難降的妖魔是什么毫蚓? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮昔善,結(jié)果婚禮上元潘,老公的妹妹穿的比我還像新娘。我一直安慰自己君仆,他們只是感情好翩概,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著返咱,像睡著了一般钥庇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咖摹,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天评姨,我揣著相機與錄音,去河邊找鬼萤晴。 笑死吐句,一個胖子當著我的面吹牛胁后,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嗦枢,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼攀芯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了文虏?” 一聲冷哼從身側(cè)響起侣诺,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎择葡,沒想到半個月后紧武,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡敏储,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了朋鞍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片已添。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滥酥,靈堂內(nèi)的尸體忽然破棺而出更舞,到底是詐尸還是另有隱情,我是刑警寧澤坎吻,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布缆蝉,位于F島的核電站,受9級特大地震影響瘦真,放射性物質(zhì)發(fā)生泄漏刊头。R本人自食惡果不足惜诸尽,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望您机。 院中可真熱鬧,春花似錦际看、人聲如沸咸产。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔼囊,卻和暖如春衣迷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酱酬。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工壶谒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膳沽。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像挑社,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痛阻,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容