Elixir 简明笔记(一)--- 初识

Elixir,中文可以翻译为“灵丹妙药”。一门运行在 Erlang 虚拟机上的新语言,称自己为灵丹妙药,可见其霸气。Elixir 尝鲜之后,发现确实是一门博采众长的新语言。下面进行 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那样可以直接输入代码就执行,也类似 Ruby 的IRB。这个交互解释器为 IEX。在 Terminal里面直接输入 iex,就可以进入elixir交互环境,按住control+z退出,或者连续安两次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"
>

字符串支持多行,敲回车就可以跳下一行,直到遇到结束的双引号。不需要在前面留白,相当赞的功能。

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

基本运算

计算机本来就是用来做计算的,elixir当然也可以做计算,以及定义函数运算。elixir支持常见的数学运算。

> 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。如果你想进行整型除法,或者求余数,可以使用divrem函数。elixir的函数调用时候的括号是可以省略的,毕竟语言的作者是 rails 的核心成员,具有浓厚的 ruby 风格。

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

匿名函数

elixir 可以定义匿名函数,并且匿名函数可以匹配某个变量,通过变量调用匿名函数。定义匿名函数的关键字是 fnend

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

elixir是函数式范式编程语言,函数贵为一等公民。既可以直接调用,也可以当参数传入。匿名函数是闭包,因此它们可以访问当前作用域(scope)内的其它变量。并且elixir也可以定义像js那种立即执行的匿名函数

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

基本数据类型

前面我们尝试了elixir的简单例子,其中发现了=这个符号,在数学里这个是等号,表示左右两边相当,学过编程的人都知道,程序里的=不是等号,而是赋值号,指把右边的表达式或数值赋给左边的变量。elixir与别的语言不一样,=不能称之为赋值号,而是匹配运算符,elixir称之为模式匹配(pattern match)。后面我们再做解释。

前面我们见识了elixir的基本数据类型中的数字相关的类型。elixir的基本数据类型包括下面的几种:

  • 布尔(boolean)
  • 数字(number)
    • 整型(integer)
    • 浮点(float)
  • 原子(atom)
  • 字符串(string)
  • 匿名函数(anonymous function)
  • 列表(list)
  • 元组(tuple)

布尔类型

elixir 用 truefalse来表示布尔类型。对于判断类型,python提供了一个 type函数相当方便,可惜elixir并没有这样的type函数。不过elixir提供了不同的函数,用来判断类型,例如判断是否是布尔类型的is_boolean函数。

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

注意,1 是数字类型,并不是布尔类型,当然在条件判断的时候,1 可以布尔值可以是true。后面会提到。

函数表示方法

elixir的文档工作做得也很好,对于语言的概念的描述和应用,也有自己的一套。例如函数的描述方法通常为 `<函数名>/<元数>`(<function name>/<arity>)。上面的判断类型函数可以描述为 `is_boolean/1`, `is_number/1`。元数可以理解为函数的参数。这个描述的好处在于,可以用帮助函数 `h` 来查看一个函数的文档和使用方法。类似python里的 `help` 函数。

使用 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.

>

配合模块的文档和函数的文档,能过构建文档完善的程序,这一点充分借鉴了Python的文档字符串设计。

原子

原子(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

列表

列表是常用的数据类型,很多语言都支持列表或者数组的结构。elixir的列表稍微有点不同。

列表的声明可以使用一对方括号[],列表的元素可以是任意的数据类型。通过++或者--可以拼接列表和消除列表

> 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]

列表相减的时候,是按照元素位置进行匹配的。想要获取列表的长度,也就是元素的个数,可以通过函数 lenght 得到,通过 hd 函数,可以获得列表的第一个元素,tl函数则获取除第一个元素的剩余列表元素。这个操作在递归的时候很有用。当列表为空的时候,hd 和 tl 都会报错。

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

列表在内存中是以链表的形式存储的,一个元素指向下一个元素,然后再下一个...直到到达列表末尾。我们称这样的一对(元素值+指向下一个元素的指针)为列表的一个单元(cons cell)。 由于列表的存储结构,获取列表的元素,都需要遍历列表,获取列表的长度是一个线性操作。我们必须遍历完整个列表才能知道它的长度而给列表删除和插入元素则相当高效。

|这个操作符可以拼接列表,指在列表前置一个列表。事实上,列表的定义,就是单个列表元素拼接起来的,写出中括号的方式只是语法糖罢了。

> 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 的列表是链式存储的,而元组则是连续存储的,因此可以通过所以的方式访问元组。当然,修改元组,比如插入删除元素则开销很大。元组的作用很大,通过用来存储一些不容易变的数据。

元组的声明很简单,只需要一对花括号{},里面的类型也可以是任意类型。可以用 elem函数和索引访问元组。

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

更多的元组操作,会在后面的内容提及。

字符列表

字符串是用双引号定义的,单引号则定义的是字符串列表,可以使用列表的一些函数操作。

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

Enjoy Elixir

这样就把elixir的基本东西快速瞥了一遍。具体每个数据类型的深入了解和运用,以及强大的函数、模块、宏等概念将会陆续介绍。

学习Elixir的时候,收获最大的则是《Elixir Programe》这本书。并且也按照自己的理解做了一些基础的翻译(github地址),这些笔记就是在翻译学习之后自己的总结。有兴趣的童鞋可以参考,或者帮忙修正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容