gen_fsm例子:code_lock

本文介绍了一个使用 Erland 语言通过 gen_fsm 行为实现的简单密码锁程序。该程序允许用户输入密码,并根据输入的密码与预设密码进行匹配来打开或锁定系统。演示了如何启动 FSM、发送按钮事件以及处理各种状态转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

改了一下代码,可以run了:
%% code_lock.erl
[code]
-module(code_lock).
-behaviour(gen_fsm).

-export([start/1, button/1]).
-export([locked/2, open/2]).
-export([init/1, handle_event/3, handle_sync_event/4, handle_info/3, code_change/4, terminate/3]).

start(Code) ->
gen_fsm:start_link({local, code_lock}, code_lock, Code, []).

button(Digit) ->
gen_fsm:send_event(code_lock, {button, Digit}).

locked({button, Digit}, {SoFar, Code}) ->
io:format("Now the code you input is: ~w~n", [SoFar ++ [Digit]]),
case SoFar ++ [Digit] of
Code ->
io:format("Open!~n"),
{next_state, open, {[], Code}, 3000};
Incomplete when length(Incomplete) < length(Code) ->
{next_state, locked, {Incomplete, Code}};
_Wrong ->
io:format("Wrong Code! Start Again!~n"),
{next_state, locked, {[], Code}}
end.

open(timeout, State) ->
io:format("Lock!~n"),
{next_state, locked, State}.

init(Code) ->
{ok, locked, {[], Code}}.

handle_event(_A, _B, _C) ->
{next_state, ok, ok}.

handle_sync_event(_A, _B, _C, _D) ->
{reply, ok, ok, ok}.

handle_info(_A, _B, _C) ->
{next_state, ok, ok}.

code_change(_A, _B, _C, _D) ->
{ok, ok, ok}.

terminate(_A, _B, _C) ->
ok.
[/code]

编译运行:
[code]
D:\erl\code>erl
Eshell V5.6.3 (abort with ^G)
1> c(code_lock).
{ok,code_lock}
2> code_lock:start([1,2,3]).
{ok,<0.36.0>}
3> code_lock:button(1).
Now the code you input is: [1]
ok
4> code_lock:button(2).
Now the code you input is: [1,2]
ok
5> code_lock:button(3).
Now the code you input is: [1,2,3]
ok
Open!
6> Lock!
6> code_lock:button(1).
Now the code you input is: [1]
ok
7> code_lock:button(2).
Now the code you input is: [1,2]
ok
8> code_lock:button(2).
Now the code you input is: [1,2,2]
ok
Wrong Code! Start Again!
9>
[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值