On Wednesday, August 5, 2015 at 10:59:18 PM UTC-4, Tim Holy wrote: > > 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). >
That was an interesting read, thank you. As a common lisper, all those gensyms were oddly comforting. Cédric > > --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 <cedric...@gmail.com > > > > > > <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 <cedric...@gmail.com> > > > > >> > > > >> 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 > > > >>>> > <isaiah...@gmail.com> > > > >>>> > > > > >>>> > 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 < > > > >>>> > > > > > >>>> > > dominiq...@gmail.com> 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! > >