Zum Beispiel möchte ich sehen, was "innerhalb" des @ time-Makros ist. Wie würde ich das tun?Wie zeige ich in Julia den Inhalt eines Makros an?
7
A
Antwort
1
Ich glaube nicht, dass es eine eingebaute Möglichkeit dafür gibt, aber Sie können die Codebasis für "macro X" suchen.
Das klingt, als wäre es ein nützliches Feature. Wenn also jemand mich korrigiert und es bereits existiert, könnten Sie immer ein Problem damit öffnen.
7
Während es das Makro selbst nicht anzeigt, können Sie die Ergebnisse der Makroerweiterung mit macroexpand
sehen. Zum Beispiel:
julia> macroexpand(:(@time rand(10)))
:(begin # util.jl, line 38:
local #60#b0 = Base.gc_bytes() # line 39:
local #61#t0 = Base.time_ns() # line 40:
local #62#val = rand(10) # line 41:
local #63#t1 = Base.time_ns() # line 42:
local #64#b1 = Base.gc_bytes() # line 43:
Base.println("elapsed time: ",Base./(Base.-(#63#t1,#61#t0),1.0e9)," seconds (",Base.-(#64#b1,#60#b0)," bytes allocated)") # line 44:
#62#val
end)
In diesem Fall zeigt es Ihnen auch, wo sie definiert ist (util.jl, Zeile 38), aber das ist nicht immer geschieht. Da Makros selbst keine Objekte der ersten Klasse sind, funktionieren die Dienstprogramme wie which
/edit
/less
(oder ihre Makroäquivalente) nicht.
1
Mindestens seit 0.5 können Sie @less
Makros zu:
julia> @less @time x
wird mit einem Editor öffnen, die den Code zeigt
macro time(ex)
quote
local stats = gc_num()
local elapsedtime = time_ns()
local val = $(esc(ex))
elapsedtime = time_ns() - elapsedtime
local diff = GC_Diff(gc_num(), stats)
time_print(elapsedtime, diff.allocd, diff.total_time,
gc_alloc_count(diff))
val
end
end