実際、この質問には 2 つの部分があるようです。
- パターンマッチングの実装方法は?
- 送信と受信(つまり、アクター モデル)を実装する方法は?
パターン マッチングの部分については、 AppやPropなどのさまざまなプロジェクトを調べてきました。これらはかなり良さそうに見えますが、最近のバージョン (4.x) の g++ では動作しませんでした。Felix言語もパターン マッチングをかなりうまくサポートしているように見えますが、実際には C++ ではありません。
Actor モデルに関しては、 ACT++ やTheronなどの既存の実装がありますが、前者に関する論文しか見つかりませんでした。後者はシングルスレッドのみです[回答を参照]。
個人的には、スレッド化とスレッドセーフなメッセージ キューを使用してアクターを実装しました。メッセージはハッシュのような構造であり、これらを多数のプリプロセッサ マクロと組み合わせて使用して、単純なパターン マッチングを実装しました。
現在、次のコードを使用してメッセージを送信できます。
(new Message(this))
->set("foo", "bar")
->set("baz", 123)
->send(recipient);
そして、単純なパターン マッチングを行うには、次のようにします (qDebug
およびqPrintable
Qt 固有です)。
receive_and_match(m)
match_key("foo") { qDebug("foo: %s", qPrintable(m->value("foo").toString())); }
or_match_key("baz") { qDebug("baz: %d", m->value("baz").toInt()); }
or_match_ignore
end_receive
ただし、これは私には少しハックに見え、あまり堅牢ではありません。
どのようにしますか?既存の作品を見逃しましたか?