On Monday, October 05, 2015 03:19:51 PM David Gold wrote:
> @Tim is it not recommended because of the use of eval to change the global
> state?
Partly, but largely because it's bad style unless there isn't a good
alternative. Some people love to generate variable names from strings (bad
idea, use an array or dict instead), and this has a similar potential for
abuse.
--Tim
>
> On Monday, October 5, 2015 at 12:39:48 PM UTC-7, Tim Holy wrote:
> > On Monday, October 05, 2015 07:19:48 PM Jameson Nash wrote:
> > > in short: you can't.
> >
> > In long: you can :-), but it's not recommended. There may be exactly one
> > case
> > in which this happens in all of Base julia, and that was from before we
> > had
> > fast tuples (yet there are still perhaps reasons to keep it). So you
> > should be
> > really, really sure you want to do this.
> >
> > As always, you can figure out how this works by looking at the typical
> > expressions, e.g.,
> >
> > ex = :(immutable Foo <: GenType end)
> >
> >
> > Here's a demo:
> >
> > julia> module MyModule
> >
> > abstract GenType
> >
> > let counter = 0
> > global foo
> > function foo()
> >
> > eval(MyModule, Expr(:type, false, Expr(:<:, symbol("Foo",
> >
> > counter+=1), :GenType), :()))
> >
> > end
> > end
> >
> > export foo
> >
> > end
> >
> > WARNING: replacing module MyModule
> > MyModule
> >
> > julia> MyModule.Foo1
> > ERROR: UndefVarError: Foo1 not defined
> >
> > julia> MyModule.foo()
> >
> > julia> MyModule.Foo1
> > MyModule.Foo1
> >
> > julia> MyModule.Foo2
> > ERROR: UndefVarError: Foo2 not defined
> >
> > julia> MyModule.foo()
> >
> > julia> MyModule.Foo2
> > MyModule.Foo2
> >
> > --Tim
> >
> > > alternatives include using a Tuple or using a Dict
> > >
> > > On Mon, Oct 5, 2015 at 2:53 PM Damien <[email protected] <javascript:>>
> >
> > wrote:
> > > > Hi all,
> > > >
> > > > I'm writing code in which I generate a composite type and various
> >
> > methods
> >
> > > > based on the fields of another type.
> > > >
> > > > I can do this at the expressions level with macros, but can I also
> > > > generate the new type definition in a plain function using
> >
> > introspection?
> >
> > > > Best