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!
>>
>>

Reply via email to