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.

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] 
> <javascript:>> 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! 
>>>
>>>
>

Reply via email to