
* feat(docs): add Erlang cheat sheet Create an Erlang备忘清单 in markdown format to document common commands and operations for Erlang programming, including入门, 代码结构, 常用内置函数 (BIFs), 并发编程, 错误处理, 分布式编程, OTP框架, 和测试. This cheat sheet aims to provide a quick reference for Erlang developers and learners, summarizing key points and examples for various aspects of the language. * docs(erlang): update links and clean up markdown formatting - Update Erlang documentation links.
451 lines
5.9 KiB
Markdown
451 lines
5.9 KiB
Markdown
Erlang 备忘清单
|
||
===
|
||
|
||
[Erlang](https://www.erlang.org/) 是一种用于构建并发、分布式和容错系统的编程语言。以下是一些常用的命令和操作。
|
||
|
||
入门
|
||
---
|
||
|
||
### 启动 Erlang Shell
|
||
|
||
```shell
|
||
erl
|
||
```
|
||
|
||
### 编译代码
|
||
<!--rehype:wrap-class=row-span-2-->
|
||
|
||
```shell
|
||
# 在 Erlang Shell 中编译
|
||
c(module).
|
||
# 在命令行中编译
|
||
erlc module.erl
|
||
```
|
||
|
||
### 运行代码
|
||
<!--rehype:wrap-class=row-span-2-->
|
||
|
||
```shell
|
||
# 在 Erlang Shell 中运行
|
||
module:function().
|
||
# 从命令行运行
|
||
erl -noshell -s module function -s init stop
|
||
```
|
||
|
||
### 退出 Erlang Shell
|
||
|
||
```shell
|
||
q().
|
||
```
|
||
|
||
代码结构
|
||
---
|
||
|
||
### 模块定义
|
||
|
||
```erlang
|
||
-module(module_name).
|
||
-export([function_name/arity, ...]).
|
||
|
||
function_name(Args) ->
|
||
% Function body.
|
||
Result.
|
||
```
|
||
|
||
### 导出函数
|
||
|
||
```erlang
|
||
-export([function1/0, function2/1]).
|
||
```
|
||
|
||
### 注释
|
||
|
||
```erlang
|
||
% 单行注释
|
||
% 这是一个注释
|
||
```
|
||
|
||
### 变量
|
||
|
||
```erlang
|
||
VarName = Value. % 变量名必须以大写字母开头
|
||
Age = 25.
|
||
Name = "Alice".
|
||
```
|
||
|
||
数据类型
|
||
---
|
||
|
||
### 原子
|
||
|
||
```erlang
|
||
atom. % 例子:atom, 'Atom with spaces'
|
||
```
|
||
|
||
### 数字
|
||
|
||
```erlang
|
||
123. % 整数
|
||
3.14. % 浮点数
|
||
```
|
||
|
||
### 布尔值
|
||
|
||
```erlang
|
||
true.
|
||
false.
|
||
```
|
||
|
||
### 字符串
|
||
|
||
```erlang
|
||
"Hello, World!".
|
||
```
|
||
|
||
### 元组
|
||
|
||
```erlang
|
||
{ok, "Success"}.
|
||
```
|
||
|
||
### 列表
|
||
|
||
```erlang
|
||
[1, 2, 3].
|
||
[H|T] = [1, 2, 3]. % H = 1, T = [2, 3]
|
||
```
|
||
|
||
### 字典 (Map)
|
||
|
||
```erlang
|
||
#{key1 => value1, key2 => value2}.
|
||
```
|
||
|
||
控制结构
|
||
---
|
||
|
||
### 条件语句
|
||
|
||
```erlang
|
||
if
|
||
Condition1 -> Expression1;
|
||
Condition2 -> Expression2;
|
||
true -> DefaultExpression
|
||
end.
|
||
```
|
||
|
||
### case 表达式
|
||
|
||
```erlang
|
||
case Expression of
|
||
Pattern1 -> Expression1;
|
||
Pattern2 -> Expression2;
|
||
_ -> DefaultExpression
|
||
end.
|
||
```
|
||
|
||
### 函数定义
|
||
|
||
```erlang
|
||
% 无参函数
|
||
my_function() ->
|
||
ok.
|
||
|
||
% 有参函数
|
||
add(A, B) ->
|
||
A + B.
|
||
```
|
||
|
||
列表操作
|
||
---
|
||
|
||
### 列表生成
|
||
|
||
```erlang
|
||
% 生成 1 到 10 的列表
|
||
[ X || X <- lists:seq(1, 10)].
|
||
|
||
% 生成 1 到 10 中的偶数
|
||
[ X || X <- lists:seq(1, 10), X rem 2 == 0].
|
||
```
|
||
|
||
并发
|
||
---
|
||
|
||
### 启动进程
|
||
|
||
```erlang
|
||
spawn(Module, Function, Args).
|
||
|
||
% 示例
|
||
Pid = spawn(fun() -> io:format("Hello from process~n") end).
|
||
```
|
||
|
||
### 发送消息
|
||
|
||
```erlang
|
||
Pid ! Message.
|
||
|
||
% 示例
|
||
Pid ! {hello, self()}.
|
||
```
|
||
|
||
### 接收消息
|
||
|
||
```erlang
|
||
receive
|
||
Pattern1 -> Expression1;
|
||
Pattern2 -> Expression2;
|
||
after Timeout -> TimeoutExpression
|
||
end.
|
||
```
|
||
|
||
### 模式匹配
|
||
|
||
```erlang
|
||
{ok, Value} = {ok, 42}.
|
||
```
|
||
|
||
常用内置函数 (BIFs)
|
||
---
|
||
|
||
### 列表操作
|
||
|
||
```erlang
|
||
lists:append(List1, List2).
|
||
lists:map(Function, List).
|
||
lists:filter(Function, List).
|
||
lists:foldl(Function, Acc, List).
|
||
```
|
||
|
||
### 元组操作
|
||
|
||
```erlang
|
||
element(N, Tuple).
|
||
setelement(N, Tuple, Value).
|
||
tuple_size(Tuple).
|
||
```
|
||
|
||
### 字符串操作
|
||
|
||
```erlang
|
||
string:len(String).
|
||
string:concat(String1, String2).
|
||
string:tokens(String, Delimiters).
|
||
```
|
||
|
||
### 文件操作
|
||
|
||
```erlang
|
||
file:read_file(Filename).
|
||
file:write_file(Filename, Data).
|
||
file:delete(Filename).
|
||
```
|
||
|
||
### 列表操作
|
||
|
||
```erlang
|
||
lists:map(fun(X) -> X * 2 end, [1, 2, 3]).
|
||
lists:filter(fun(X) -> X rem 2 == 0 end, [1, 2, 3, 4]).
|
||
```
|
||
|
||
### 字符串操作
|
||
|
||
```erlang
|
||
string:len("Hello").
|
||
string:upper("hello").
|
||
```
|
||
|
||
### 文件操作
|
||
|
||
```erlang
|
||
{ok, File} = file:open("test.txt", [write]).
|
||
file:write(File, "Hello, file!").
|
||
file:close(File).
|
||
```
|
||
|
||
### 示例:简单的服务器
|
||
|
||
```erlang
|
||
-module(server).
|
||
-export([start/0, loop/0]).
|
||
|
||
start() ->
|
||
spawn(fun loop/0).
|
||
|
||
loop() ->
|
||
receive
|
||
{echo, Msg} ->
|
||
io:format("Echo: ~p~n", [Msg]),
|
||
loop();
|
||
stop ->
|
||
io:format("Server stopping~n"),
|
||
ok;
|
||
_ ->
|
||
io:format("Unknown message~n"),
|
||
loop()
|
||
end.
|
||
```
|
||
|
||
并发编程
|
||
---
|
||
|
||
### 创建进程
|
||
|
||
```erlang
|
||
Pid = spawn(Module, Function, Args).
|
||
```
|
||
|
||
### 发送消息
|
||
|
||
```erlang
|
||
Pid ! Message.
|
||
```
|
||
|
||
### 接收消息
|
||
|
||
```erlang
|
||
receive
|
||
Pattern1 -> Actions1;
|
||
Pattern2 -> Actions2;
|
||
...
|
||
end.
|
||
```
|
||
|
||
### 链接进程
|
||
|
||
```erlang
|
||
link(Pid).
|
||
unlink(Pid).
|
||
```
|
||
|
||
### 监控进程
|
||
|
||
```erlang
|
||
MonitorRef = erlang:monitor(process, Pid).
|
||
erlang:demonitor(MonitorRef).
|
||
```
|
||
|
||
错误处理
|
||
---
|
||
|
||
### 捕获异常
|
||
|
||
```erlang
|
||
try Expression of
|
||
Pattern -> Result
|
||
catch
|
||
Class:Reason -> Handler
|
||
end.
|
||
```
|
||
|
||
### 常见异常类型
|
||
|
||
- `throw`
|
||
- `error`
|
||
- `exit`
|
||
|
||
### 错误处理
|
||
|
||
```erlang
|
||
try Expression of
|
||
Pattern -> Result
|
||
catch
|
||
Type:Reason -> ErrorHandlingExpression
|
||
end.
|
||
```
|
||
|
||
分布式编程
|
||
---
|
||
|
||
### 启动分布式节点
|
||
|
||
```shell
|
||
erl -name nodename@hostname -setcookie Cookie
|
||
```
|
||
|
||
### 连接节点
|
||
|
||
```erlang
|
||
net_adm:ping(Node).
|
||
```
|
||
|
||
### 发送消息到远程节点
|
||
|
||
```erlang
|
||
{remote_process, 'remote_node@host'} ! Message.
|
||
```
|
||
|
||
OTP 框架
|
||
---
|
||
|
||
### 定义 GenServer
|
||
|
||
```erlang
|
||
-module(my_gen_server).
|
||
-behaviour(gen_server).
|
||
|
||
-export([start_link/0, init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
|
||
|
||
start_link() ->
|
||
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||
|
||
init([]) ->
|
||
{ok, #state{}}.
|
||
|
||
handle_call(Request, From, State) ->
|
||
{reply, Reply, State}.
|
||
|
||
handle_cast(Msg, State) ->
|
||
{noreply, State}.
|
||
|
||
handle_info(Info, State) ->
|
||
{noreply, State}.
|
||
|
||
terminate(Reason, State) ->
|
||
ok.
|
||
|
||
code_change(OldVsn, State, Extra) ->
|
||
{ok, State}.
|
||
```
|
||
|
||
### 使用 GenServer
|
||
|
||
```erlang
|
||
gen_server:start_link({local, Name}, Module, Args, Options).
|
||
gen_server:call(ServerRef, Request).
|
||
gen_server:cast(ServerRef, Msg).
|
||
```
|
||
|
||
测试
|
||
---
|
||
|
||
### 编写 EUnit 测试
|
||
|
||
```erlang
|
||
-module(module_name_tests).
|
||
-include_lib("eunit/include/eunit.hrl").
|
||
|
||
simple_test() ->
|
||
?assertEqual(Expected, Actual).
|
||
|
||
complex_test_() ->
|
||
[
|
||
{"Test case 1", ?_assertEqual(Expected1, Actual1)},
|
||
{"Test case 2", ?_assertEqual(Expected2, Actual2)}
|
||
].
|
||
```
|
||
|
||
### 运行 EUnit 测试
|
||
|
||
```shell
|
||
# 在命令行中运行
|
||
erl -eval "eunit:test(module_name)" -s init stop
|
||
```
|
||
|
||
另见
|
||
---
|
||
|
||
- [Erlang 官方文档](https://www.erlang.org/docs)
|
||
- [Erlang 编程书籍](https://learnyousomeerlang.com/content)
|