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
命名:ぬこ 命名:にゃん 命名:みけ ぬこが『にゃに?』 にゃんが『にゃに?』 みけが『にゃーにゃー』 ぬこが『にゃーにゃー』 にゃんが『にゃーにゃー』 みけが『にゃに?』 ぬこが『にゃーにゃー』 にゃんが『にゃに?』 みけが『にゃに?』 ぬこが寝ます。 にゃんが『にゃに?』 みけが『にゃに?』 にゃんが『にゃに?』 みけが『にゃーにゃー』 にゃんが寝ます。 みけが『にゃに?』 みけが寝ます。 ぬこが起きました。 ぬこが寝ます。 にゃんが起きました。 にゃんが寝ます。 みけが起きました。 みけが死んでしまいました ぬこが起きました。 ぬこが『にゃーにゃー』 ぬこが死んでしまいました にゃんが起きました。 にゃんが死んでしまいました