The "do" block syntax was for me one of the more difficult aspects of Julia's 
syntax to wrap my head around, although now I use it frequently. I just 
expanded this section of the manual, trying to incorporate elements of this 
discussion.

--Tim

On Monday, April 28, 2014 12:57:23 AM Peter Simon wrote:
> Going back and rereading the 'open' documentation,  it clearly states that
> the method taking a function as its first argument will apply that function
> to the file handle returned by the method without the handle.   Thanks for
> your patience.
> 
> On Apr 27, 2014 9:41 PM, "Peter Simon" <psimon0...@gmail.com> wrote:
> > Ah, you just switched on the light for me.  I thought that the example was
> > illustrating a general principle, but in fact the essential feature
> > depends
> > on knowledge of the way that the 'open' method is coded.
> > 
> > Thanks!
> > 
> > On Apr 27, 2014 9:24 PM, "Amit Murthy" <amit.mur...@gmail.com> wrote:
> >> 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/lat
> >>>>>>> est/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