Perlで書かれたプロセス指向の例を Squeak Smalltalk で

16 :デフォルトの名無しさん:2010/10/11(月) 19:46:50
これがプロセス指向らしい・・・
sub neko {
 my $q = shift or die $!;

 return threads->new(sub {
  my $namae = '';

  while (1) {
   my $message = $q->dequeue();

   if ($$message{command} eq 'namae') {
    $namae = $$message{namae};
    print "命名:$namae\n";
   } elsif ($$message{command} eq 'nake') {
    print "にゃーにゃー\n";
   } elsif ($$message{command} eq 'nero') {
    print "$namaeが寝ます。\n";
    sleep(3);
    print "$namaeが起きました。\n"
   } elsif ($$message{command} eq 'sine') {
    print "$namaeが死んでしまいました\n";
    last;
   }
  }
 });
}

オブジェクト指向風に書き直すと



関数型言語は何故普及しないのかを考える


細かい仕様を変えてしまっていますが、まあそこは適当に。トランスクリプトがスレッドセーフでないのが、いろいろと面倒でこねくっていますのであしからず。オブジェクト指向風については華麗にスルー。

| ねこ ねこ達 |
World findATranscript: nil.
ねこ := [:キュー |
   [  | 名前 死亡フラグ? |
      名前 := '名無し'.
      死亡フラグ? := false.
      [  | メッセージ |
         Transcript nextPutAll: (
            ((メッセージ := キュー next) value) caseOf: {
               [#名前] -> [名前 := メッセージ key. '命名:', 名前].
               [#鳴け] -> [名前, 'が『にゃーにゃー』'].
               [#寝ろ] -> [
                  Transcript nextPutAll: 名前, 'が寝ます。', String cr.
                  3 seconds asDelay wait.
                  名前, 'が起きました。'].
               [#死ね] -> [
                  死亡フラグ? := true.
                  名前, 'が死んでしまいました']}
            otherwise: [名前, 'が『にゃに?』']), String cr.
            Processor yield.
            死亡フラグ?
      ] whileFalse
   ] fork
].
ねこ達 := #(ぬこ にゃん みけ) collect: [:各々 |
   SharedQueue new nextPut: 各々 -> #名前; yourself].
ねこ達 do: [:各々 | ねこ value: 各々].
20 timesRepeat: [ねこ達 atRandom nextPut: #(寝ろ 鳴け 謎) atRandom].
ねこ達 do: [:各々 | 各々 nextPut: #死ね].
[ねこ達 allSatisfy: [:各々 | 各々 isEmpty]] whileFalse.
Transcript endEntry
命名:ぬこ
命名:にゃん
命名:みけ
ぬこが『にゃに?』
にゃんが『にゃに?』
みけが『にゃーにゃー』
ぬこが『にゃーにゃー』
にゃんが『にゃーにゃー』
みけが『にゃに?』
ぬこが『にゃーにゃー』
にゃんが『にゃに?』
みけが『にゃに?』
ぬこが寝ます。
にゃんが『にゃに?』
みけが『にゃに?』
にゃんが『にゃに?』
みけが『にゃーにゃー』
にゃんが寝ます。
みけが『にゃに?』
みけが寝ます。
ぬこが起きました。
ぬこが寝ます。
にゃんが起きました。
にゃんが寝ます。
みけが起きました。
みけが死んでしまいました
ぬこが起きました。
ぬこが『にゃーにゃー』
ぬこが死んでしまいました
にゃんが起きました。
にゃんが死んでしまいました