3

このようなスレッドごとに1つずつ、2つのロガーを作成しました(THREAD = 2):

lsd_logger[THREADS]      : list of message_logger is instance; 
  keep for each in lsd_logger {
      soft it.tags      == {appendf("DBG%d",index).as_a(message_tag)};
      it.to_file        == appendf("lsd%d.elog", index);
      soft it.verbosity == HIGH;
      it.to_screen == FALSE;
  };

これで、次のように、現在実行中のスレッドに従って各ロガーにメッセージを送信するチェッカーができました。

messagef(appendf("DBG%d",thread).as_a(message_tag), MEDIUM, "this is a message to logger %d",thread);

しかし、これが一定の冗長性ではないことについて、このエラーが発生し続けます。

印刷を処理する関数を作成する代わりに、このように message_tag を与える方法はありますか?

ありがとうございました、

4

1 に答える 1

3

いいえ、これは不可能です。メッセージのタグはハードコーディングする必要があるため、タグを返す式ではなく、定数タグにする必要があります。

次のようなメソッドを定義することで、問題を解決できる可能性があります。

my_message() is {
    case thread {
        0: {
            messagef(DBG0, MEDIUM, "this is a message to logger 0");
           };
        1: {
            messagef(DBG1, MEDIUM, "this is a message to logger 1");
           };
    };
};

次に、この非常に長いメソッドを繰り返しコード (スレッドの数が変わるたびに変更する必要さえあります) で記述することを避けたい場合は、define as computed代わりに次のようなマクロを使用できます。

define <my_message'action> "my_message" as computed {
    items: list of string;
    for i from 0 to THREADS-1 do {
        items.add(appendf("%d: {messagef(DBG%d, MEDIUM, \"this is a message to logger %d\")}", i, i, i));
    };
    result = appendf("case thread { %s }", str_join(items, ";"));
};
于 2016-01-21T11:11:07.670 に答える