Câu hỏi Trong Julia, làm cách nào để hiển thị nội dung của macro?


Ví dụ: tôi muốn xem nội dung "bên trong" của macro @time. Làm thế nào tôi sẽ làm điều này?


7
2018-05-01 08:50


gốc




Các câu trả lời:


Mặc dù nó không hiển thị cho bạn chính macro, nhưng bạn có thể thấy kết quả của việc mở rộng macro với macroexpand. Ví dụ:

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)

Trong trường hợp này, nó cũng cho bạn thấy nơi nó được định nghĩa (util.jl, dòng 38), nhưng điều đó không phải lúc nào cũng xảy ra. Vì các macro không phải là các đối tượng lớp đầu tiên, nên các tiện ích như which/edit/less (hoặc tương đương vĩ mô của họ) không hoạt động.


7
2018-05-01 13:46





Tôi không nghĩ rằng có một cách xây dựng để làm điều này, nhưng bạn có thể tìm kiếm các codebase cho "macro X".

Điều này nghe có vẻ như nó sẽ là một tính năng hữu ích, do đó, trừ khi ai đó sửa chữa tôi và nó đã tồn tại, bạn luôn có thể mở một vấn đề yêu cầu nó.


1
2018-05-01 10:07





Ít nhất kể từ 0,5, bạn có thể @less macro cũng vậy:

julia> @less @time x

sẽ mở ra một trình soạn thảo, hiển thị mã

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

1
2017-09-23 07:19