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