���졢erlang�ˤ��äƤĤ�������ʤΤˡ��ɤ����ޤ���Ĥ����Τ褦�ʤΤǡ�

sumii������ - ����������
�Ǥϡ�������������������Τɤ��餫�����ˤʤä��顢�⤦�����ΰ����˴ؤ�餺�����֤��פ褦�������±黻��por�פϼ����Ǥ���Ǥ��礦�������Ĥޤꡢ
int f() { return 1; }   /* ���Ѽ����� */
int g() { return g(); } /* Ʊ��       */

int main() {
  return por(f(), g()) && por(g(), f()) && !por(0, 0);
}
�Τ褦�ʥץ�����ब1���֤���por�ץޥ����Ͻ񤱤�Ǥ��礦����

�ޤ���erlang�ǡ����ϥꥹ�Ȥ�ʣ���񤱤�褦�ˤ��Ƥ���ޤ����ޤ�����äƤ��ʤ��ץ������⤭�������ʩ�����Ƥ��ޤ���

-module(por).
-export([por/1, t/0, f/0, l/0]).

por(List)     -> por(List, []).
por([], List) -> por_wait(List);
por([Head|Tail], List) ->
  S = self(), 
  por(Tail, [spawn(fun() -> S ! Head()  end) | List]).

por_wait(List)    -> por_wait(length(List), List).
por_wait(0, _)    -> false;
por_wait(N, List) ->
  receive Result  ->
    if Result == false -> por_wait(N - 1, List);
       true            -> 
         lists:map(fun(P) -> exit(P,kill) end, List), 
         true
    end
  end.

t() -> true.
f() -> false.
l() -> l().
1> c(por).                              
{ok,por}
2> por:por([fun por:f/0, fun por:f/0]).
false
3> por:por([fun por:f/0, fun por:t/0]).
true
4> por:por([fun por:t/0, fun por:f/0]).
true
5> por:por([fun por:t/0, fun por:t/0]).
true
6> por:por([fun por:l/0, fun por:t/0]).
true
7> por:por([fun por:t/0, fun por:l/0]).
true
8> por:por([fun por:t/0, fun por:l/0]) and por:por([fun por:l/0, fun por:t/0]) and not por:por([fun() -> false end, fun() -> false end]) .
true
9>  i().

�ݡ����֥뤫�ĽŤ�perl�Ǥϡ�����ʴ�����

sub por {
    my %running = ();
    for my $cond (@_) {
        my $pid = fork();
        defined $pid or die "fork failed:$!";
        if ($pid) {
            $running{$pid}++;    # parent
        }
        else {
            my $code = ref $cond ? $cond : sub { $cond };
            exit $code->();      # child
        }
    }
    while (%running) {
        delete $running{ wait() };
        next unless $?;
        kill INT => keys %running;
        delete $running{ wait() } while %running;
        return 1;
    }
    return 0;                    # false;
}
my $f = sub { 1 };
my $g;
$g = sub { no warnings 'recursion'; $g->() };

my $cond = por($f, $g) && por($g, $f) && !por(0, 0);
print "$cond\n"; # 1

���ƤΤȤ��ꡢ�ɤ����

sumii������ - ����������
�Τ褦�ʥץ�����ब1���֤���por�ץޥ����Ͻ񤱤�Ǥ��礦��������������OS�Υ����ƥॳ�������������ϻȤ�ʤ����ȤȤ��ޤ���

�Ȥ������ˤ�����ȿ§����̩�ˤ�erlang�Ǥ�OS�ǤϤʤ�erlang�μ¹ԴĶ�������������Ƥ���Ƥ���Τǡ���æˡ�����ɰ�ˡ�ˤ��餺�פ����Τ�ޤ��󤬡�

��������ΰճ��ʸ��ѤǤ��͡������������ȡ����ޤ����ĵ��ݤ��Ƥ���֤�Ϳ�ޤ����Ժη褷�Ƥ��봶��...

Dan the Infinite Looper