El domingo, 31 de mayo de 2015, 0:37:45 (UTC+2), Jameson escribió: > > But "@eval" is still a macro, so it is even better to rewrite this without > that: > function getfn() > return function(); 1; end > end > const n = getfn() >
This does not give quite the same answer, though, since the function does not have a name. Is there a way to specify the name of a generated function like this? > > On Sat, May 30, 2015 at 2:30 PM David Gold <[email protected] > <javascript:>> wrote: > >> Something to note about Tom's method is that the name function must be >> passed to gf as a symbol, unlike in the case of a macro. However, in most >> cases this slight difference probably will not warrant a macro. >> >> >> On Friday, May 29, 2015 at 8:58:56 PM UTC-4, Tom Lee wrote: >>> >>> You don't need to use a macro, a function can do this: >>> >>> julia> function gf(n::Symbol = gensym()) >>> @eval function $(n)() >>> 1 >>> end >>> end >>> >>> I've also made the n argument optional, with gensym creating a unique >>> name by default - the newly defined function is returned by gf, so you >>> don't necessarily need to know its name. And of course if you give gf >>> additional arguments you can programatically construct expressions based >>> those and easily $ them into the @eval block. It's all very awesome. >>> >>> But the point is a macro probably isn't appropriate for this type of >>> thing. My understanding is that you should never use a macro if you can >>> easily write an equivalent function. >>> >>> Cheers, >>> >>> Tom >>> >>> On Thursday, 28 May 2015 23:26:39 UTC+10, Mauro wrote: >>>> >>>> Like this: >>>> >>>> julia> macro gf(n) >>>> quote >>>> function $(esc(n))() >>>> 1 >>>> end >>>> end >>>> end >>>> >>>> julia> @gf foo >>>> foo (generic function with 1 method) >>>> >>>> julia> foo() >>>> 1 >>>> >>>> On Thu, 2015-05-28 at 12:06, Vasudha Khandelwal <[email protected]> >>>> wrote: >>>> > Can I use macros to generate functions with names passed as argument >>>> to the >>>> > macro? >>>> >>>>
