例如,我想看看@time宏的“内部”是什么。我该怎么做?
答案 0 :(得分:7)
虽然它没有显示宏本身,但您可以使用macroexpand
查看宏扩展的结果。例如:
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)
在这种情况下,它还会显示它的定义位置(util.jl,第38行),但并不总是这样。由于宏本身不是第一类对象,因此which
/ edit
/ less
(或它们的宏等效项)等实用程序不起作用。
答案 1 :(得分:1)
我认为没有内置的方法可以执行此操作,但您可以在代码库中搜索"macro X"。
这听起来像是一个有用的功能,所以除非有人纠正我并且它已经存在,否则你总是可以打开一个请求它的问题。
答案 2 :(得分:1)
至少从0.5开始,你也可以@less
个宏:
julia> @less @time x
将打开一个显示代码的编辑器
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