I thought this was about the logic, the conditional election of a 
function's definition .. however, its about expressing that, rather than 
the ability to do that.

On Thursday, June 16, 2016 at 12:56:40 PM UTC-4, Mauro wrote:
>
> See https://github.com/JuliaLang/julia/issues/16965 
>
> On Thu, 2016-06-16 at 16:38, Jeffrey Sarnoff <[email protected] 
> <javascript:>> wrote: 
> > that is not right, please enter it as an issue 
> > https://github.com/JuliaLang/julia/issues 
> > 
> > (include your minimal example as 
> > ```julia 
> > <example that fails> 
> > ``` 
> > and the commit id) 
> > 
> > On Thursday, June 16, 2016 at 10:11:23 AM UTC-4, Chris Rackauckas wrote: 
> >> 
> >> 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 <[email protected]> 
> 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