The actual function as defined in base/io.jl function open(f::Function, args...) io = open(args...) try f(io) finally close(io) end end
Just multiple dispatch at work. The 'open' variant without a file handle is called first. On Mon, Apr 28, 2014 at 9:44 AM, Peter Simon <psimon0...@gmail.com> wrote: > Right, I don't have a problem with that. I simply used "inner" as a way > to refer to the function that is used as the first argument to the other > ("outer") function. Sorry if I abused a conventional meaning of these > terms. > > I would like to know how this anonymous function (in the "open" example) > is passed the file handle. My confusion stems from the fact that this > handle, to my knowledge, is not available until the "open" function > provides it as its return value. > > > On Sunday, April 27, 2014 8:59:50 PM UTC-7, Amit Murthy wrote: > >> It is just a way to define an anonymous function. It is not a way to >> define an "inner" function in that sense. >> >> >> On Mon, Apr 28, 2014 at 9:24 AM, Peter Simon <psimo...@gmail.com> wrote: >> >>> My question concerns where this handle comes from. Isn't the handle >>> coming from the output of 'open'? Since 'open' is the "outer" function of >>> the 'do' construct, then why doesn't the outer function in the first >>> example also supply its output as input to its inner function? >>> >>> >>> On Sunday, April 27, 2014 8:40:27 PM UTC-7, Amit Murthy wrote: >>> >>>> Without using a do-block, you would need to pass in a function as the >>>> first argument to 'map'. >>>> 'open' has a variant where the first argument is again a function that >>>> accepts an open handle. >>>> >>>> The do-block syntax in this case just allows you to define the said >>>> function. >>>> >>>> >>>> On Mon, Apr 28, 2014 at 8:55 AM, Peter Simon <psimo...@gmail.com>wrote: >>>> >>>>> In the Julia manual, the second example in block-syntax-for-function- >>>>> arguments<http://docs.julialang.org/en/latest/manual/functions/#block-syntax-for-function-arguments> >>>>> contains >>>>> the following do block: >>>>> >>>>> open("outfile", "w") do f >>>>> write(f, data) >>>>> end >>>>> >>>>> and the documentation states that "The function argument to open receives >>>>> a handle to the opened file." I conclude from this that the return value >>>>> (i.e., the file handle) of the open function is passed to this function f >>>>> -> write(f, data) that is used as the first argument of open. So far, so >>>>> good (I think). But now I go back and take another look at the first do >>>>> block example: >>>>> >>>>> map([A, B, C]) do x >>>>> if x < 0 && iseven(x) >>>>> return 0 >>>>> elseif x == 0 >>>>> return 1 >>>>> else >>>>> return x >>>>> endend >>>>> >>>>> I try to interpret this example in light of what I learned from the >>>>> second example. The map function has a return value, consisting of the >>>>> array [A, B, C], modified by applying the function in the do block to >>>>> each element. If this example behaved like in the second example, then >>>>> the output of the map function should be passed as an input to the >>>>> function defined in the do block. Clearly this doesn't happen, so the >>>>> lesson I learned from the second example doesn't apply here, apparently. >>>>> Why not? Under what conditions is the output of the outer function >>>>> passed as an input to the inner function? >>>>> >>>>> I must be looking at this wrong and would appreciate some help in getting >>>>> my mind right :-). >>>>> >>>>> Thanks, >>>>> >>>>> Peter >>>>> >>>>> >>>> >>