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 am taking that to mean replace `Base.call` with a function name.  But 
that does not work if the function is in 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