1

Julia マクロを使用していると、試行錯誤のプログラミングに陥ってしまうようですが、これも例外ではありません。式のエラーをキャッチし、式が失敗した場合にフラグを設定する単純なマクロを作成しようとしています。呼び出しコンテキストで式 (1 つまたは複数の代入ステートメントを含む可能性があります) を評価したいので、これはマクロです。したがって、次のようなものです:

macro flag_errors(ex)
    broken = false
    esc(quote
        try
            $(ex)
        catch
            broken = true
        end
    end) 
end

関数をネストするさまざまな方法を試しましescたが、呼び出し環境で割り当てを適切に評価する方法をまだ見つけていません。

julia> @flag_errors a=2
2

julia> a
a not defined

julia> @flag_errors a=2+"X"
true

julia> a
a not defined

julia> broken
broken not defined

このマクロの正しい書き方は? tryブロックが問題の原因ですか?

4

3 に答える 3

3

範囲の問題であるというToivoの意見に同意します。たとえば、次のコードを実行すると、グローバル環境で a が正しく割り当てられます。

julia>@flag_errors global a = 2
a

julia>a
2

aしたがって、グローバル環境に存在することに問題がなければ、問題は解決します。これがすでに別のスコープ (関数、試行など) にある場合は、さらに実験する必要があります。

乾杯。

于 2013-01-17T15:22:40.260 に答える
1

try新しいスコープブロックが導入されているので、このブロックが原因だと思います。ex一般にこれを元に戻すことができるようにするには、割り当てを分析するためにかなり深刻なメタプログラミングが必要になります。なぜあなたはそれが必要なのですか?

于 2013-01-16T16:19:04.880 に答える