小编zxq*_*xq9的帖子

Erlang进程与Java线程

我正在阅读SašaJurić的"Elixir in Action"一书,在第一章中它说:

Erlang进程完全相互隔离.它们不共享内存,一个进程崩溃不会导致其他进程崩溃.

Java线程也不是这样吗?我的意思是当Java线程崩溃时,它也不会崩溃其他线程 - 特别是,如果我们正在查看请求处理线程(让我们main从这个讨论中排除线程)

java erlang elixir

60
推荐指数
4
解决办法
7457
查看次数

差异确定并结束 [Erlang]

在 Erlang 中以 end 和 ok 结束函数有什么区别?我一直在试图理解以下代码中的含义:

-module(esOne).
-export([start/1, func/1]).

start(Par) ->
    io:format("Client: I am ~p, spawned by the server: ~p~n",[self(),Par]),
    spawn(esOne, func, [self()]),
    Par ! {onPid, self()},
    serverEsOne ! {onName, self()},
    receiveMessage(),
    ok.

receiveMessage() ->
    receive
        {reply, N} ->
            io:format("Client: I received a message: ~p~n",[N])
    after
        5000->
            io:format("Client: I received no message, i quit~n",[])
    end.

func(Parent)->
    io:format("Child: I am ~p, spawned from ~p~n",[self(),Parent]).
Run Code Online (Sandbox Code Playgroud)

此代码与充当服务器的另一个 .erl 文件结合使用。我只能通过分析给定的服务器文件并复制它的行为来编写这个。首先,我认为 ok 用于结束每个函数,但事实并非如此,因为我不能用 ok 结束 receiveMessage()。然后我想我可以用 end 结束每个函数,但是如果我用 end 替换 ok,start(Par) 会出错。不仅如此,在服务器文件中,我看到 ok 和 …

erlang

4
推荐指数
1
解决办法
400
查看次数

如何检查输入是否是Erlang中的字符串?

我想编写一个函数来检查输入是否是字符串,如下所示:

is_string(Input) ->
  case check_if_string(Input) of
    true  -> {ok, Input};
    false -> error
  end.
Run Code Online (Sandbox Code Playgroud)

但我发现检查输入是否是Erlang中的字符串是很棘手的.Erlang中的字符串定义在这里:http://erlang.org/doc/man/string.html.

有什么建议?

提前致谢.

erlang

4
推荐指数
1
解决办法
1092
查看次数

是否有必要为wxErlang小部件创建ID?

我一直在探索Erlang的wx模块和教程.我之前没有使用过wxwidgets,所以也许这就是它的完成方式,但这段代码对我来说真的很糟糕:

%% create widgets
    T1001 = wxTextCtrl:new(Panel, 1001,[]),
    ST2001 = wxStaticText:new(Panel, 2001,"Output Area", []),
    B101  = wxButton:new(Panel, 101, [{label, "&Countdown"}]),
    B102  = wxButton:new(Panel, ?wxID_EXIT, [{label, "E&xit"}]),
    wxFrame:show(Frame),
Run Code Online (Sandbox Code Playgroud)

人们是否真的必须在创建小部件时为其分配小部件ID?在窗口小部件ID之后命名指向窗口小部件的变量是否正常?

erlang wxwidgets wxerlang

3
推荐指数
2
解决办法
1715
查看次数

Erlang地图之间的实际区别:删除/ 2和地图:没有/ 2

检查一个新的R17功能,地图的文档,带我到地图:删除/ 2和地图:没有/ 2.我能看到的唯一明显区别是remove/2只接受一个键并返回一个没有它的地图视图,其中没有/ 2接受一个列表并返回一个缺少列出的键的全新地图.

22> M1 = #{foo => bar, spam => eggs}.
#{foo => bar,spam => eggs}
23> M2 = maps:without([foo], M1).
#{spam => eggs}
24> M3 = maps:remove(foo, M1).
#{spam => eggs}
25> M1.
#{foo => bar,spam => eggs}
26> M2.
#{spam => eggs}
27> M3.
#{spam => eggs}
Run Code Online (Sandbox Code Playgroud)

这有什么实际影响?我可以欣赏不想创建没有/ 2的巨型地图的内存副本,但为什么不删除/ 2接受列表?我假设存在一个以性能为导向的原因,为什么这两个函数以它们的方式存在,但是我很困惑何时我想在大多数情况下使用一个而不是另一个(意思是,我不认为维护巨大的地图通常是个好主意).

erlang

2
推荐指数
1
解决办法
308
查看次数

列表说明:折叠功能

我越来越多地了解Erlang语言并且最近遇到了一些问题.我读到了关于foldl(Fun, Acc0, List) -> Acc1功能.我使用了learnyousomeerlang.com教程并且有一个例子(例子是关于Erlang中的反向波兰表示法计算器):

%function that deletes all whitspaces and also execute
rpn(L) when is_list(L) ->
  [Res] = lists:foldl(fun rpn/2, [], string:tokens(L," ")),
  Res.

%function that converts string to integer or floating poitn value
read(N) ->
  case string:to_float(N) of
    %returning {error, no_float} where there is no float avaiable
    {error,no_float} -> list_to_integer(N);
    {F,_} -> F
  end.

%rpn managing all actions
rpn("+",[N1,N2|S]) -> [N2+N1|S];
rpn("-", [N1,N2|S]) -> [N2-N1|S];
rpn("*", [N1,N2|S]) -> [N2*N1|S];
rpn("/", [N1,N2|S]) -> [N2/N1|S];
rpn("^", [N1,N2|S]) -> …
Run Code Online (Sandbox Code Playgroud)

erlang recursion functional-programming tail-recursion fold

2
推荐指数
1
解决办法
646
查看次数

如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

我有一个GenServer通过连接到远程TCP连接的gen_tcp

opts = [:binary, active: true, packet: :line] {:ok, socket} = :gen_tcp.connect('remote-url', 8000, opts}

我正在处理以下消息:

def handle_info({:tcp, socket, msg}, stage) do IO.inspect msg {:noreply, state} end

哪个很棒。但是,TCP服务器容易超时。如果使用gen_tcp.recv,则可以指定超时。但是,我使用active: true来接收消息handle_info,而不必遍历和调用recv。因此,GenServer即使服务器已超时,也愉快地等待下一条消息。

GenServer如果X秒后仍未从TCP连接接收到消息,该如何触发函数?我会坚持使用recv吗?

erlang elixir gen-tcp

1
推荐指数
1
解决办法
616
查看次数