Much more digestible now, from my point of view. Thanks. --Peter
On Monday, April 28, 2014 3:43:20 AM UTC-7, Tim Holy wrote: > > 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" <psimo...@gmail.com <javascript:>> > 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....@gmail.com<javascript:>> > 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 > > >> <psimo...@gmail.com<javascript:>>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 >