2017-01-21 1 views
0

Matlabでプロトタイプとデバッグを行う際に、スクリプトを実行して、失敗)。Juliaはループ内のすべての変数をグローバルにスコープします(一時的に)

ジュリアでは、ループ内の変数にローカルスコープが設定されています。いったん私が満足すればこれはうまくいくのですが、REPLの変数を調べることはできません。私がこれを回避するには、ループ内のすべての変数をグローバルとしてリストすることが唯一の方法です。変数名を変更するか、新しい変数を導入するたびに、その行を編集する必要があります。変数を追加/変更することは、私が実験しているときに、私がまだやっていることを完全にはっきりと確認していないときには、よくあることですこれを行うより良い方法はありますか?

+1

は、デバッガを試したことがありますか? https://github.com/Keno/Gallium.jl –

+0

私はデバッガを使用することはめったにありませんが、他に良い解決策がない場合は試してみます。 – Todd

答えて

1

私は次の非常に基本的でシンプルなマクロを思いついた。考え方は、すべての割り当てに対してprintステートメントを追加して式を変更することです。

これを使用するには、目的の関数または式のブロックの前に@add_printを追加します。

しかし、最善の解決策は、ガリウムデバッガを使用することになり

walk(ex) = nothing 

function walk(ex::Expr) 
    for i in 1:length(ex.args) 
     subex = ex.args[i] 
     #println(subex) 
     walk(subex) 
     if isa(subex, Expr) && subex.head in Set([:(=), :(+=), :(-=), :(*=), :(/=)]) && ex.head == :block 
      #println(subex) 
      line = "line unknown:" 
      if i > 1 && ex.args[i-1].head == :line 
       line = "line $(ex.args[i-1].args[1])" 
      end 
      var = string(subex) 
      ex.args[i] = :(
       begin 
        $subex 
        println($line) 
        println($var, " -> ", $(subex.args[1])) 
       end 
      ) 
     elseif ex.head == :block && isa(subex, Symbol) 
      ex.args[i] = :(
       begin 
        println($subex) 
        $subex 
       end 
      ) 
     end 
    end 
end 

macro add_print(ex) 
    walk(ex) 
    ex 
end 

デモ:

@add_print function binary_search(v, val) 
    if v[1] > val || v[end] < val 
     return 0 
    end 
    left = 1 
    right = length(v) 
    while left < right 
     mid = div(left + right, 2) 
     if v[mid] < val 
      left = mid + 1 
     else 
      right = mid 
     end 
    end 
    left 
end 

binary_search([1, 3, 4, 5, 7, 9], 4) 

julia> binary_search([1, 3, 4, 5, 7, 9], 4) 
line 5 
left = 1 -> 1 
line 6 
right = length(v) -> 6 
line 8 
mid = div(left + right,2) -> 3 
line 12 
right = mid -> 3 
line 8 
mid = div(left + right,2) -> 2 
line 10 
left = mid + 1 -> 3 
3 
+0

これは参考になりますが、私は大規模な配列や、ディスプレイにダンプしたくないものを扱っています。 – Todd

+0

マクロのほとんどのセクションを読んだだけです。サブ式の代入で変数を印刷するのではなくグローバルとして宣言することは可能ですか? – Todd

関連する問題