私は次の非常に基本的でシンプルなマクロを思いついた。考え方は、すべての割り当てに対して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
は、デバッガを試したことがありますか? https://github.com/Keno/Gallium.jl –
私はデバッガを使用することはめったにありませんが、他に良い解決策がない場合は試してみます。 – Todd