You may want to check the IProfile.jl package, which does a lot of this kind of stuff (including inserting timing code around each line of a function).
--Tim On Wednesday, August 05, 2015 06:47:31 PM Cedric St-Jean wrote: > Yichao Yu: How would you retrieve the counter's value? How would you > distinguish between the counter in function foo vs. the one in function bar? > On Wednesday, August 5, 2015 at 3:56:12 PM UTC-4, Yichao Yu wrote: > > On Wed, Aug 5, 2015 at 2:42 PM, Cedric St-Jean <[email protected] > > > > <javascript:>> wrote: > > > In my case, I wanted to count how many times some functions were called. > > > Kinda like a profiler, but for a different purpose. If the function name > > > > was > > > > > available, I could move the macro "call" inside the function body, which > > > would make more sense. > > > > Than what about sth like > > > > ```julia > > macro count_execute() > > > > @gensym counter > > quote > > > > global $counter > > if isdefined(:($counter)) > > > > $counter = $counter::Int + 1 > > > > else > > > > $counter = 0 > > > > end > > > > end > > > > end > > ``` > > > > > On Wednesday, August 5, 2015 at 2:25:42 PM UTC-4, Isaiah wrote: > > >> I'm still curious what problem / design this is trying to solve. Be > > > > aware > > > > >> that doing something like this for custom runtime dispatching is likely > > > > to > > > > >> be slow (except in the macro case which does not really count). > > >> > > >> Are you both coming from some other programming language that exposes > > > > this > > > > >> in a first-class way? Both PHP and JavaScript seem to make this > > > > information > > > > >> available, but R does not (except for a callstack hack). > > >> > > >> On Wed, Aug 5, 2015 at 2:10 PM, Cedric St-Jean <[email protected]> > > >> > > >> wrote: > > >>> I also wish that the name was visible... I wrote the macro a few days > > >>> ago: > > >>> > > >>> macro expose_name(fdef) > > >>> > > >>> @capture(fdef, begin function fname_ (args__) body__ end end) > > >>> esc(:(function $(fname) ($(args...)) > > >>> > > >>> let function_name = $(Expr(:quote, fname)) > > >>> > > >>> $(body...) > > >>> > > >>> end)) > > >>> > > >>> end > > >>> > > >>> @expose_name function foo () @show function_name end > > >>> > > >>> Cédric > > >>> > > >>> On Wednesday, August 5, 2015 at 12:54:38 PM UTC-4, Tim Holy wrote: > > >>>> Alternatively, > > >>>> > > >>>> julia> for (offset, f) in enumerate((:foo1, :foo2, :foo3)) > > >>>> > > >>>> @eval begin > > >>>> > > >>>> function $f(x) > > >>>> > > >>>> println("This is ", $f) > > >>>> x + $offset > > >>>> > > >>>> end > > >>>> > > >>>> end > > >>>> > > >>>> end > > >>>> > > >>>> julia> foo1(0) > > >>>> This is foo1 > > >>>> 1 > > >>>> > > >>>> julia> foo2(0) > > >>>> This is foo2 > > >>>> 2 > > >>>> > > >>>> julia> foo3(0) > > >>>> This is foo3 > > >>>> 3 > > >>>> > > >>>> --Tim > > >>>> > > >>>> On Wednesday, August 05, 2015 12:48:29 PM Isaiah Norton wrote: > > >>>> > Can I ask what is your use-case, and whether you've done this in > > > > some > > > > >>>> > other > > >>>> > language? From a quick google there are appear to be some (possibly > > >>>> > non-standard) C and C++ compiler defines that provide the current > > >>>> > function > > >>>> > name, but other than that: > > >>>> > > > >>>> > - Python rejected a PEP for this feature ( > > >>>> > https://www.python.org/dev/peps/pep-3130/) > > >>>> > - Java does not support it in a first-class way ("could use > > >>>> > stacktrace, but > > >>>> > potentially unreliable") > > >>>> > - some lisps appear to have interactive mode support for this kind > > > > of > > > > >>>> > introspection, but nothing general. > > >>>> > > > >>>> > The recommended way to solve problems that require this level of > > >>>> > introspection is to do code generation via metaprogramming. > > >>>> > > > >>>> > > > >>>> > On Wed, Aug 5, 2015 at 12:36 PM, Isaiah Norton > > >>>> > <[email protected]> > > >>>> > > > >>>> > wrote: > > >>>> > > No. > > >>>> > > > > >>>> > > Ok, technically, you could do this (inspired by > > > > https://github.com/JuliaLang/julia/issues/8066#issuecomment-61136584): > > >>>> > > julia> function foo() > > >>>> > > > > >>>> > > bt = backtrace() > > >>>> > > lookup = ccall(:jl_lookup_code_address, Any, (Ptr{Void}, > > >>>> > > > > >>>> > > Int32), > > >>>> > > > > >>>> > > bt[2], 0) > > >>>> > > > > >>>> > > name = lookup[1] > > >>>> > > end > > >>>> > > > > >>>> > > foo (generic function with 1 method) > > >>>> > > > > >>>> > > julia> foo() > > >>>> > > > > >>>> > > :foo > > >>>> > > > > >>>> > > But that is a really, really bad idea. Please don't do that. > > >>>> > > > > >>>> > > On Wed, Aug 5, 2015 at 12:04 PM, Dominique Orban < > > >>>> > > > > >>>> > > [email protected]> wrote: > > >>>> > >> Sorry if this has been asked before. Is it possible to determine > > >>>> > >> the name > > >>>> > >> of a function inside that function? For example, > > >>>> > >> > > >>>> > >> function blah(x) > > >>>> > >> > > >>>> > >> my_name = ... # should evaluate to "blah" or :blah > > >>>> > >> > > >>>> > >> end > > >>>> > >> > > >>>> > >> I didn't see that in the introspection section of the > > >>>> > >> documentation. > > >>>> > >> > > >>>> > >> Thanks!
