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?

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