如何让Erlang模块相互通信?

时间:2013-05-09 04:42:29

标签: erlang otp

我正在Erlang中构建一个简单的控制台游戏。在过去的两天里,我一直在编写一些Erlang模块和测试,一切正常(在各个模块中)。我对如何运行游戏并让模块一起工作感到困惑。

我一直在阅读“大善”一书并且已经阅读了很多关于OTP的内容,但感觉压倒一切。有一个简单的教程,我可以在某处?本书中的OPT示例是否因为我想要做的事而过度了?

更新:感谢您的反馈。这是一个更具体的问题。

我有两个模块......

Console_IO模块

-module(console_io).
-export([display/1, display_welcome_message/0, gets/1]).

display(Message) ->
  io:format(Message).

gets(Message) ->
  {ok, [X]} = io:fread(Message, "~s").
  io:format("You entered '~s'.", [X]);

display_welcome_message() ->
  display("Welcome to the game!").

密码模块

-module(secret_code).
-export([generate/0, symbols/0]).

generate() ->
  random:seed(now()),
  [lists:nth(random:uniform(6), symbols()) || _ <- lists:seq(1, 4)].

symbols() ->
  ["b","g","p","r","y","o"].

这两个模块位于不同的文件中。我希望这些模块能够相互通信,以便用户输入猜测,尝试猜测密码并且游戏返回“是”或“否”。

我想在我的“获取”语句中添加两行来生成密码并将其与猜测进行比较:

-module(console_io).
-export([display/1, display_welcome_message/0, gets/1]).

display(Message) ->
  io:format(Message).

gets(Message) ->
  {ok, [X]} = io:fread(Message, "~s"),
  Code = secret_code:generate,
  Code -- [X].

display_welcome_message() ->
  display("Welcome to the game!").

我知道我没有走上正轨。有一种简单的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:2)

Code = secret_code:generate,应该被称为函数调用Code = secret_code:generate(),。比较可以使用模式匹配来完成。代码如下

-module(console_io).
-export([display/1, display_welcome_message/0, gets/1]).

display(Message) ->
  io:format(Message).

gets(Message) ->
  {ok, [X]} = io:fread(Message, "~s"),
  Code = secret_code:generate(),
  check_code(X, Code).

check_code(Code, Code) ->
    yes;
check_code(_, _) ->
    no.

display_welcome_message() ->
  display("Welcome to the game!").

注意secret_code的不同之处在于它是以字符串形式获取而不是返回字符串列表

-module(secret_code).
-export([generate/0, symbols/0]).

generate() ->
  random:seed(now()),
  [lists:nth(random:uniform(6), symbols()) || _ <- lists:seq(1, 4)].

symbols() ->
  "bgpryo".

示例运行:

1> console_io:gets(">").
>bgryo
yes
2> console_io:gets(">").
>bgryj
no
3>

答案 1 :(得分:2)

您已在 console_io 模块io:format(Message)
格式 io 模块的功能 secret_code 模块random:seed(now())随机模块的种子功能。
与调用的方式相同生成 secret_code 模块的功能,如下所示:secret_code:generate()

您可以在线阅读LearnYouSomeEralng教程,这是最好的教程之一Erlang / OTP并且在所有方面都是完整的。