On Sunday, January 31, 2016 at 4:27:00 AM UTC-5, Bryan Rivera wrote:
>
> I just realized #13412 <https://github.com/JuliaLang/julia/pull/13412> has 
> been merged.
>
> What should this look like now that `Base.call(...)` is deprecated?
>

It will be once Julia 0.5 is released (and it still has no announced 
release date, so it can be a ways off)
 

>
> Thinking something like:
>
> (_::SomeCallBack)(c) = _.z + c
>
>
> On Sunday, January 31, 2016 at 3:47:03 AM UTC-5, Bryan Rivera wrote:
>>
>> Cedric, I refactored the problem and this works well.
>>
>> What do you mean "I would favor using a regular function call with a 
>> descriptive name"?
>>
>> I was thinking replace `Base.call` with a function name.  But that does 
>> not work if the function is in the top-level scope in another file.
>>
>> On Thursday, January 21, 2016 at 9:56:51 PM UTC-5, Cedric St-Jean wrote:
>>>
>>> Something like this?
>>>
>>> function function1(a, b, f) # Variable needed in callback fun injected.
>>>     if(a > b)
>>>       c = a + b
>>>       res = f(c) # Callback function has been injected.
>>>       return res + 1
>>>     else
>>>       # do anything
>>>       # but return nothing
>>>     end
>>> end
>>>
>>> type SomeCallBack
>>>     z::Int
>>> end
>>> Base.call(callback::SomeCallBack, c) = c + callback.z
>>>
>>> function1(2, 1, SomeCallBack(10))
>>>
>>> Because of JIT, this is 100% equivalent to your "callback function has 
>>> been injected" example, performance-wise. My feeling is that .call 
>>> overloading is not to be abused in Julia, so I would favor using a regular 
>>> function call with a descriptive name instead of call overloading, but the 
>>> same performance guarantees apply. Does that answer your question?
>>>
>>> On Thursday, January 21, 2016 at 9:02:50 PM UTC-5, Bryan Rivera wrote:
>>>>
>>>> I think what I wrote above might be too complicated, as it is an 
>>>> attempt to solve this problem.
>>>>
>>>> In essence this is what I want: 
>>>>
>>>>
>>>>
>>>> function function1(a, b, onGreaterThanCallback)
>>>>   if(a > b)
>>>>     c = a + b
>>>>     res = onGreaterThanCallback(c, z)
>>>>     return res + 1
>>>>   else
>>>>     # do anything
>>>>     # but return nothing
>>>>   end
>>>> end
>>>>
>>>>
>>>> global onGreaterThanCallback = (c) -> c + z
>>>>
>>>> function1(a, b, onGreaterThanCallback)
>>>>
>>>>
>>>> Problems:
>>>>
>>>> The global variable.
>>>>
>>>> The anonymous function which has performance impact (vs other 
>>>> approaches).  We could use Tim Holy's @anon, but then the value of `z` is 
>>>> fixed at function definition, which we don't always want.
>>>>
>>>> I think that the ideal optimization would look like this:
>>>>
>>>>       function function1(a, b, z) # Variable needed in callback fun 
>>>> injected.
>>>>         if(a > b)
>>>>           c = a + b
>>>>           res = c + z # Callback function has been injected.
>>>>           return res + 1
>>>>         else
>>>>           # do anything
>>>>           # but return nothing
>>>>         end
>>>>       end
>>>>
>>>>
>>>>       function1(a, b, z)
>>>>
>>>> In OO languages we would be using an abstract class or its equivalent. 
>>>>  But I've thought about it, and read the discussions on interfaces, and 
>>>> don't see those solutions optimizing the code out like I did above.
>>>>
>>>> Any ideas?
>>>>
>>>

Reply via email to