当前代码评估列表中的一个项目,然后是下一个项目,依次直到列表末尾。向代码添加并发性的一种方法是将逻辑分为两部分:评估和附加到结果列表。
评估:遍历列表并在单独的线程中评估每个项目,并将结果存储在布尔列表中。
Append:循环遍历布尔列表(在创建时同时),如果值为真,则添加到结果列表中。跳过所有错误值。
示例解决方案:
fun {FilterConc L F}
ResultBool
fun {Evaluate L F}
case L of X|Xs then
thread {F X} end|{Evaluate Xs F}
else nil end
end
fun {AppendLoop L1 ResultBool1}
case ResultBool1 of R|Rs then
case L1 of X|Xs then
case R of true then
X|{AppendLoop Xs Rs}
else {AppendLoop Xs Rs} end
else nil end
else nil end
end
in
ResultBool = {Evaluate L F}
%{Browse ResultBool} ---> shows [true false false false true true true]
{AppendLoop L ResultBool}
end
{Show {FilterConc [1 2 4 6 121 52381 1235] Int.isOdd}}
% ---> shows [1 121 52381 1235]