查看原文:
http://www.wagerlabs.com/blog/2008/08/erlang-recursive-anonymous-functions-and-waiting-for-messages.html
我们有个需求,我们要等待某个消息,同时过滤指定的消息。我们可以定义一个macro,来实现。
看代码:
-define(WAITMSG(Msg, Timeout, Skip),
fun() ->
F = fun(F) ->
receive
Msg ->
success;
Packet ->
DoSkip = lists:member(Packet, Skip),
if
DoSkip ->
F(F);
true ->
{error, Packet}
end
after Timeout ->
{error, timeout}
end
end,
F(F)
end()).
代码中需要说明的几个地方:
1,在macro中,我们定义了一个anonymous fun, 并执行(通过最后一行end()来调用),fun() -> some expression end() 即定义了一个fun,并调用。同样 fun(Arg1, Arg2..., ArgN) -> some expression end(Param1, Param2..., ParamN)也定义并调用了这个具有多个参数的anonymous fun.
2,F fun中,我们通过将anonymous函数作为参数传递的方法实现循环,即F(F).
使用这个macro
case ?WAITMSG(login, 1000, [msg1, msg2, msg3]) of
success ->
io:format("success~n");
{error, Error} ->
io:format("error~n")
end
分享到:
相关推荐
递归函数的定义 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 递归函数的特点 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但...
Oracle 递归函数介绍
省市县递归函数
匿名函数,也称为拉姆达函数,是一种使用JavaScript函数的强大方式。以下总结了匿名函数的特点: 任何函数表达式从技术上说都是匿名函数,因为没有引用它们的确定的方式; 在无法确定如何引用函数的情况下,递归...
由原始递归函数经过合成或原始递归得到的函数仍是原始递归函数.
第五章 函数与应用5.6递归思想和递归函数正确答案:B你选对了如果递归函数没有递归结束的语句,将会导致无穷递归,从而执行时出现“死循环”正确答案:2 3 6如下
递归和非递归方式计算Ackerman函数。非递归方法用堆栈实现。代码内部有详细的注释说明,比较适于学习。
二分法 解函数 c++语言 c语言 递归 数根
演示了如何把低效率的递归函数转换成非递归的函数并完成相同的计算。
C语言递归函数设计,如何使用递归函数进行算法计算,这样可以提高程序的质量
简单的递归函数示意图-PDF可编辑格式,方便自己可视化了解递归函数每个步骤的状态
Fibonacci数列,用c++编写的,非递归的函数调用求Fibonacci数列的第n项
阿克曼函数非递归实现,用到了堆栈,对于学习数据结构的人来说很有用
不管是什么编程语言,... 那么问题来了,我们知道在Javascript中,有一类函数叫做匿名函数,没有名称,怎么调用呢?当然你可以说,可以把匿名函数赋值给一个常量: const factorial = function(n){ if (n <= 1) {
递归函数例子8个数据结构 递归函数例子8个
Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是它需要...
根据题目要求使用递归函数,根据题目给定的数学算式,求出Succ(n)的值。可以在每一次调用递归函数时增加一个计数器,用来计算调用了多少次函数,最后输出Succ(n)的值和调用递归函数次数的值。
代码实例,主要是介绍基本递归的实现,函数的调用等。
ackman函数的递归和非递归,学习数据结构的素材,非递归是使用堆栈实现的。
c++递归函数基本代码.zip