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