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

Reply via email to