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