Erlang基础语法
By Leeting Yan
Erlang是一种函数式编程语言,特别适用于构建可扩展和容错的系统。以下是Erlang的一些基础语法元素,包括代码示例和说明:
1. 模块定义
每个Erlang文件都是一个模块,使用-module()属性来定义模块名。
-module(example).
这表示当前文件是一个名为example的模块。
2. 导出函数
使用-export()属性来指定模块中可以被外部调用的函数。
-export([start/0, add/2]).
这表示example模块导出了两个函数:start(无参数)和add(接受两个参数)。
3. 函数定义
函数定义的一般形式是function_name/arity,其中arity是函数参数的数量。
start() ->
io:fwrite("Starting the example~n").
这里定义了一个名为start的函数,它不接受任何参数,使用io:fwrite输出一行文本到控制台。
4. 模式匹配
Erlang广泛使用模式匹配来处理数据。
add(X, Y) ->
X + Y.
在这个add函数中,X和Y是参数,它们通过加法操作进行模式匹配。
5. 条件表达式
Erlang使用if和case作为条件表达式。
is_positive(N) ->
case N > 0 of
true -> true;
false -> false
end.
is_positive函数检查参数N是否大于0。
6. 循环和递归
Erlang没有传统的循环结构,而是使用递归来实现循环。
factorial(N) ->
case N of
0 -> 1;
_ -> N * factorial(N - 1)
end.
factorial函数使用递归计算阶乘。
7. 列表和元组
Erlang支持列表和元组,列表使用方括号[],元组使用花括号{}。
list_example() ->
[1, 2, 3, 4].
tuple_example() ->
{1, "example", 3.14}.
8. 列表推导式
列表推导式是Erlang中一种简洁的构建列表的方法。
squared_list(N) ->
[X * X || X <- lists:seq(1, N)].
这个函数生成一个包含从1到N每个数字平方的列表。
9. 匿名函数
Erlang支持匿名函数,常用于高阶函数。
anonymous_function = fun(X) -> X * 2 end.
定义了一个接受一个参数X并返回X乘以2的匿名函数。
10. 进程和消息传递
Erlang的进程非常轻量级,进程间通过消息传递进行通信。
spawn_process() ->
spawn(fun() -> io:fwrite("This is a new process~n") end).
使用spawn创建一个新进程,该进程执行一个匿名函数。
11. 接收消息
Erlang的receive语句用于接收和处理消息。
process_messages() ->
receive
{sender, Message} -> io:fwrite("Received message: ~p~n", [Message]);
timeout -> io:fwrite("No message received~n")
end.
这个函数等待接收消息,根据消息内容执行不同的操作。
这些基础语法元素构成了Erlang编程的基础,通过它们可以构建复杂的并发和分布式系统。
下面是一个简单的Erlang程序示例,该程序定义了一个模块,包含几个基本的函数,用于演示Erlang的基础语法和特性。我将逐行解释代码的每一部分。
%% 文件名: hello.erl
% 定义模块名为 hello
-module(hello).
% 导出函数,使得其他模块可以调用 start/0 和 greet/1
-export([start/0, greet/1]).
% start/0 函数作为程序的入口点
start() ->
% 打印 "Hello, World!" 到控制台
io:fwrite("Hello, World!~n"),
% 调用 greet/1 函数,传入字符串 "Alice"
greet("Alice").
% greet/1 函数接受一个字符串参数 Name
% 并打印一条欢迎信息到控制台
greet(Name) ->
% 使用 io:fwrite 打印格式化的字符串,"Hello, ~s!" 会被替换为 Name
io:fwrite("Hello, ~s!~n", [Name]).
% 以下是Erlang shell交互示例,演示如何编译和运行上述代码
% 1> c(hello). % 编译hello.erl文件
% {ok,hello}
% 2> hello:start(). % 调用hello模块的start/0函数
% Hello, World!
% Hello, Alice!
% ok
逐行解释:
- 第1行:
%% 文件名: hello.erl是一个注释,指明当前代码文件的名称。 - 第4行:
-module(hello).定义了当前文件的模块名为hello。 - 第6行:
-export([start/0, greet/1]).导出了两个函数,start/0和greet/1,使得它们可以被其他模块调用。 - 第8行:定义了
start/0函数,它是程序的入口点。 - 第10行:使用
io:fwrite函数打印"Hello, World!“到控制台,~n是一个换行符。 - 第12行:调用了
greet/1函数,并传入字符串"Alice"作为参数。 - 第14行:定义了
greet/1函数,它接受一个参数Name。 - 第16行:使用
io:fwrite打印一条欢迎信息,~s是一个字符串占位符,[Name]是参数列表,将替换占位符为传入的参数值。 - 第20行以后是Erlang shell的交互示例,展示了如何编译和运行
hello模块。
这个例子展示了Erlang的基本语法,包括模块定义、函数导出、函数定义、模式匹配、控制台输出以及如何从Erlang shell编译和运行模块。