Elixir从入门到进阶(一)
前言
Elixir 是 Erlang 的一个现代化的版本,更接近 OCaml。
这个系列的文章将通过一个很快速的方式入门 Erlang。这篇文章建议拥有一定的 C/C++等语言基础以及任意一门 FP 类语言基础(如 Haskell)后再行阅读。
以上为前言,Let's start!
第一章 Hello,World!
接下来我先给出一段代码,然后逐一解释。
-module定义了当前这个程序模块的名字,注意,这个名字应当和代码文件名(除拓展名后)相同。比如这里是-module(helloworld).,那么程序名就应当是helloworld.erl。这个东西对于 Java 程序员肯定不陌生,因为 Java 也会将 Main 定义在一个 class 里面。类似的,在 Haskell 中也有像module xxx () where来定义一个模块,只不过在 Haskell 中不需要定义模块才能运行代码,这个变化有可能是 Erlang 使用了 BEAM 虚拟机的缘故,毕竟类似的使用了 JVM 的 Java 当中也需要定义一个模块。扯多了,看下一句。
-export([FunctionName/Parameter])导出了这个程序当中的函数,类似 Haskell 当中module语句中间括号当中的导出函数一样。其中[start/0]意思是导出start函数,这个函数有 0 个参数。
-import(ModuleName,[FunctionName/Parameter])引入了函数。这里引入了io模块的fwrite函数。
接下来定义了start函数,并且调用io模块当中的fwrite函数进行输出。
注意,Erlang 使用.作为句末符,类似 C++中的;,使用,作为若干个连续句子的连接(后面有实例),可能是为了贴近英文句子的格式吧(
这就是一个 HelloWorld 程序,接下来我们要运行它。这个文件名字为helloworld.erl,那么接下来运行这些代码运行它:
$ erlc helloworld.erl
$ erl -noshell -s helloworld start -s init stop接下来你就能看到输出:
Hello, world!条件处理
case expression
case expression of
value1 -> statement#1;
value2 -> statement#2;
valueN -> statement#N
end.学过 Haskell 的对这个概念理解就会很轻松,对于 Haskell 当中 case expression 是这样的:
case expression of pattern -> result
pattern -> result
pattern -> result
...这里 Erlang 的value和 Haskell 当中的pattern对应,当expression的内容和其中一个值匹配时,就执行某个语句。
if expression
if
condition1 ->
statement#1;
condition2 ->
statement#2;
conditionN ->
statement#N;
true ->
default-statement
end.这里的 if 其实可以从模式匹配的角度去看:就是若干个条件,其中有一个符合时就会运行对应的 statement,而true作为一个条件一定符合,所以就能够起到 default 的作用。
函数与递归
作为一个学过编程语言的人,并不需要我解释递归是什么东西。所以这章我就只讲 Erlang 中函数定义以及基本使用。
Erlang 中函数允许重载。
Erlang 中函数的基本定义是:FunctionName(Pattern1… PatternN) -> Body
定义好一个函数之后,应当使用 export 导出这之后才能使用。
Anonymous Function
匿名函数用fun()定义:fun() -> Body end.
when 表达式
when 表达式可以决定函数是否被运行,如下所示:
FunctionName(P1,...,PN) when condition -> Body
when 中表达式成立的时候,Body 才会被执行。其实这类似于一种强化版的模式匹配,此处使用逻辑进行参数匹配。
附录
运算符
算术运算
+,-,*,/:加减乘除,不多赘述
div,rem:整除符号和取余符号,在 Python 当中就是//,%,在 Haskell 中就是div,mod。
关系运算
==,/=,<,=<,>,>=比较运算,其中/=是不等于,这里和 Haskell 比较像;=<是小于等于,比较怪异。
逻辑运算
or,and,not,xor:标准命名,不多赘述
位运算
band,bor,bxor,bnot:位与,位或,位异或,位反。
优先级
: > # > bnot,not > /,*,div,rem,band,and > +,-,bor,bxor,or,xor>比较运算。