在Erlang中有一种方式引用当前正在执行的函数)?
这对产生无限循环很有用:
spawn(fun() -> do_something, this_fun() end)
Run Code Online (Sandbox Code Playgroud)
在JavaScript arguments.callee中就是这样,请参阅MDC规范.
编辑回答'为什么你会这样做':主要是好奇心; 在prorotyping时定义一个计时器也很有用:
Self = self(),
spawn(fun() -> Self ! wake_up, receive after 1000 -> nil end, this_fun() end),
%% ...
Run Code Online (Sandbox Code Playgroud)
leg*_*cia 28
在Erlang/OTP 17.0-rc1中,您可以使用命名的乐趣:
1> Self = self(),
1> Fun = fun ThisFun() ->
Self ! wake_up,
receive after 1000 -> nil end,
ThisFun()
end.
#Fun<erl_eval.44.71889879>
2> spawn(Fun).
<0.35.0>
3> flush().
Shell got wake_up
Shell got wake_up
Shell got wake_up
ok
Run Code Online (Sandbox Code Playgroud)
在早期版本中,没有办法做到这一点.您可以将函数本身作为参数传递:
Self = self(),
Fun = fun(ThisFun) ->
Self ! wake_up,
receive after 1000 -> nil end,
ThisFun(ThisFun)
end
spawn(fun() -> Fun(Fun) end),
%% ...
Run Code Online (Sandbox Code Playgroud)
如果你想要扭曲一点东西:
Y = fun(M,B) -> G = fun(F) -> M(fun() -> (F(F))() end, B) end, G(G) end.
spawn(Y(fun(F, ParentPid) -> fun() -> ParentPid ! wake_up, receive after 1000 -> ok end, F() end end, self())).
Run Code Online (Sandbox Code Playgroud)
刷新消息几次以查看结果:
flush().
Run Code Online (Sandbox Code Playgroud)
当然,如果你把它放在某种库中,Y会更有用.你也可以在Y Combinators上找到这篇文章:http://bc.tech.coop/blog/070611.html非常有趣
| 归档时间: |
|
| 查看次数: |
2810 次 |
| 最近记录: |