Hello World
%% hello.erl
-module(hello).
-export([start/0]).
start() ->
io:format("Hello World~n").
上述文件中,
-module(hello).
指的是此文件包含用于hello模块的代码。它应该与文件名一致(除了.erl这个文件拓展名)。模块必须以一个小写字母开头。模块名属于一个原子。
--export([start/0]).
表示没有参数的函数start可以在模块外调用(类似于Java中的public)。如果想导出多个函数,使用以下语法:
-export([function1/N1, function2/N2, ...]).
Erlang Shell
可在控制命令行输入erl
进入Erlang shell,用halt()
方法退出。
在Erlang shell中,c(moduleName).
命令编译moduleName.erl
文件里的代码,并生成moduleName.beam
文件。例如:
PS E:\ErlangFile> erl
Eshell V8.3 (abort with ^G)
1> c(hello).
{
ok,hello}
2> hello:start().
Hello World
ok
3> halt().
PS E:\ErlangFile>
在Erlang shell外,编译和运行如下:
$ erlc moduleName.erl
$ erl -noshell -s hello start -s init stop
erl -noshell -s hello start -s init stop
命令加载了hello
模块并执行hello:start()
函数。随后,执行了init:stop()
终止了Erlang对话。
PS E:\ErlangFile> erlc hello.erl
PS E:\ErlangFile> erl -noshell -s hello start -s init stop
Hello World
PS E:\ErlangFile>
Erlang基础
1. 注释
Erlang里的注释从一个百分号字符(%
)开始,一直延伸到行尾。Erlang没有块注释。
2. 数字
Erlang里的数字不是整数就是浮点数。
- 整数
整数的运算是精确的,而且用来表示整数的位数只受限于可用的内存。
整数可以有三种不同的写法。
- 传统写法
- K进制整数 除10以外的数字进制整数使用
K#Digits
这种写法。
1> 16#11.
17
2> 32#12.
34
$
写法$C
这种写法代表了ASCII字符C的整数代码。
- 浮点数
一个浮点数由五部分组成:一个可选的正负号,一个整数部分,一个小数点,一个分数部分和一个可选的指数部分。
1> 4/2.
2.0
2> 5/3.
1.6666666666666667
3. 变量
- Erlang中的变量以大写字母开头。
- 可用"
=
"操作符给变量赋值,严格来说是给变量绑定一个值。因为在Erlang中,变量一旦绑定了值,就不允许重新绑定。“=
” -> 模式匹配符。 - 以小写字母开头的不是变量而是符号常量,称为原子。
4. 原子(atom)
- 在Erlang中,原子是全局性的,而且是不需要宏定义和包含文件即可实现的。
- 原子以小写字母开头,后接一串字母、数字、下划线、@符号。原子还可以放在单引号( ’ )中。可以用这种方式创建以大写字母开头的或者包含其他符号的原子,如
'Monday'
,'*&^123'
。甚至可以给无需引号的原子加上引号,因此'a'
和a
的意思是完全一致的。
5. 元组(tuple)
元组,用于保存固定数量的元素。创建元组的方法就是用大括号{}
把想要表达的值括起来,并用逗号分隔他们。
6. 列表(list)
列表,被用来存放任意数量的事物。创建列表的方法是用中括号[]
把列表元素括起来,并用逗号分隔开。
7. 字符串
严格来说,Erlang里没有字符串。要在Erlang中表示字符串,可以选择一个由整数组成的列表或者二进制型。当字符串表示为一个整数列表时,列表里的每个元素都代表了一个Unicode代码点。
可以用字符串字面量来创建一个列表。字符串字面量其实就是用双引号围起来的一串字符。
1> Name = "Hello".
"Hello"
"Hello"其实是一个列表的简写,这个列表包含了代表字符串里各个字符的整数字符代码。
当shell打印某个列表的值时,如果列表里的所有整数都代表可打印字符,他就会将其打印成字符串字面量。否则打印成列表记法。
Eshell V8.3 (abort with ^G)
1> [1,2,3].
[1,2,3]
2> [115,117,114,101].
"sure"
3> [1,115,117,114,101].
[1,115,117,114,101]
另外,$a
代表字符a的整数。
Eshell V8.3 (abort with ^G)
1> I = $s.
115
2> [I-32,$u,$r,$e].
"Sure"
用列表来表示字符串时,它里面的各个整数都代表Unicode字符。必须使用特殊格式的语法才能输入某些字符,在打印列表时也需要选择正确的格式惯例。
Eshell V8.3 (abort with ^G)
1> X = "a\x{221e}b".
[97,8734,98]
2> io:format("~ts~n", [X]).
a\x{
221E}b
ok
如果shell将某个整数列表打印成字符串,而你想打印成一列整数则需要使用格式化:
Eshell V8.3 (abort with ^G)
1> X = [97,98,99].
"abc"
2> io:format("~w~n", ["abc"]).
[97,98,99]
ok
模块
模块是Erlang的基本单元。模块保存在扩展名为.erl
的文件里,而且必须先编译才能运行模块里的代码。编译后的模块以.beam
作为扩展名。
-module(bit_test).
-compile(export_all).
-mytags("This is my tags").
reverse_bitstring_by_byte(BitString) ->
ByteList = [Byte || <<Byte:8>> <= BitString],
ReverseByteList = lists:reverse(ByteList),
ReverseBitString = list_to_binary(ReverseByteList),
ReverseBitString.
reverse_bitstring_by_bit(BitString) ->
BitList = [Bit ||