gen_fsm例子:code_lock

本文介绍了一个使用Erlang的gen_fsm行为实现的简单数字锁。通过输入正确的数字序列来解锁,错误的输入会导致重新开始。代码展示了如何定义状态机、处理事件以及状态之间的转换。

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

关键字: gen_fsm code_lock 改了一下代码,可以run了:


    • %% code_lock.erl
    • -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.

编译运行:

    • 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
    •   
    • 6>
    • 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 Start
    • 9>
<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(1112) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值