Re: [julia-users] Conditional Definition of Functions?

2016-06-16 Thread Mauro
On Thu, 2016-06-16 at 07:32, Chris Rackauckas  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.


Re: [julia-users] Conditional Definition of Functions?

2016-06-16 Thread Chris Rackauckas
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  > 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. 
>


Re: [julia-users] Conditional Definition of Functions?

2016-06-16 Thread Jeffrey Sarnoff
that is not right, please enter it as an issue   
https://github.com/JuliaLang/julia/issues

(include your minimal example as
```julia 

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

Re: [julia-users] Conditional Definition of Functions?

2016-06-16 Thread Mauro
See https://github.com/JuliaLang/julia/issues/16965

On Thu, 2016-06-16 at 16:38, Jeffrey Sarnoff  wrote:
> that is not right, please enter it as an issue
> https://github.com/JuliaLang/julia/issues
>
> (include your minimal example as
> ```julia
> 
> ```
> 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  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.
>>>
>>


Re: [julia-users] Conditional Definition of Functions?

2016-06-16 Thread Jeffrey Sarnoff
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  > wrote: 
> > that is not right, please enter it as an issue 
> > https://github.com/JuliaLang/julia/issues 
> > 
> > (include your minimal example as 
> > ```julia 
> >  
> > ``` 
> > 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  
> 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. 
> >>> 
> >> 
>