It fails when you put it in a function:

function g(a)
  if a
    f() = 2
  else
    f() = 3
  end
  return f
end
f = g(true)
f() # Returns 3

Even more interestingly, g(false) in another REPL session gives an error: 
"f not defined". So in this setup you either get the second function (if 
you ask for the first one), or you get nothing! This is on Commit 59d1539 
(4 days old master).

On Thursday, June 16, 2016 at 1:34:34 AM UTC-7, Mauro wrote:
>
> On Thu, 2016-06-16 at 07:32, Chris Rackauckas <rack...@gmail.com 
> <javascript:>> wrote: 
> > There seems to be an interesting change between v0.4.5 and v0.5. Take a 
> > look at the following code: 
> > 
> >   if largeFluctuations 
> >     function σ(y,t) 
> >       dσ = zeros(19) 
> >       dσ[1] = noiseLevel*1.5y[1] 
> >       dσ[18]= noiseLevel*6y[18] 
> >       return(dσ) 
> >     end 
> >   else 
> >     function σ(y,t) 
> >       dσ = zeros(19) 
> >       dσ[1] = 0.02y[1] 
> >       dσ[16]= 0.02y[16] 
> >       dσ[18]= 0.2y[18] 
> >       dσ[17]= 0.02y[17] 
> >       return(dσ) 
> >     end 
> >   end 
> > 
> > In v0.4.5, this would work as expected: if largeFluctuations was set to 
> > true, then you would get the first function and if false the second. In 
> > v0.5, I tracked down to this error where it will always define sigma as 
> the 
> > second function. 
> > 
> > Is this change intentional? If so, why? 
>
> Sounds like a bug to me.  However this works as expected: 
>
> julia> a = false 
> false 
>
> julia> if a 
>        f() = 2 
>        else 
>        f() = 3 
>        end 
> f (generic function with 1 method) 
>
> julia> f() 
> 3 
>
> new session: 
>
> julia> a = true 
> true 
>
> julia> if a 
>        f() = 2 
>        else 
>        f() = 3 
>        end 
> f (generic function with 1 method) 
>
> julia> f() 
> 2 
>
> Maybe you can try to reduce your example further? 
>
> > Is the proper way to do this in v0.5 using anonymous functions? I know 
> > there was a change to faster anonymous functions, but is it as fast as 
> > regular function, or are there some notable differences? 
>
> Anonymous and normal functions are based on the same machinery in 0.5 
> (e.g. anonymous functions can have methods now too).  Both have the same 
> performance, also when used inside higher order functions. 
>

Reply via email to