Yes, although I think we should perhaps return a single object that holds
both the fd and the process object.

On Tue, Jun 21, 2016 at 4:34 PM, David van Leeuwen <
david.vanleeu...@gmail.com> wrote:

> Another case for open()!, I suppose, is the construction
>
> fd, process = open(`command`)
>
> which I wasn't able to fit in the do-block construction.
>
> ---david
>
> On Tuesday, June 21, 2016 at 5:43:36 PM UTC+2, Stefan Karpinski wrote:
>>
>> I was not aware that you could do multiple `as` clauses on a single
>> `with` line – that makes the construct considerably more useful since it
>> reduces the indentation. However, it still doesn't address cases where you
>> don't want to give the object to be finalized a name, e.g.
>> readstring(open("file.txt")!), which we currently express with the somewhat
>> awkward open(readstring, "file.txt") idiom.
>>
>> On Tue, Jun 21, 2016 at 11:25 AM, David van Leeuwen <
>> david.va...@gmail.com> wrote:
>>
>>> Hello,
>>>
>>> On Monday, June 20, 2016 at 5:38:04 PM UTC+2, Stefan Karpinski wrote:
>>>>
>>>> The reason as Cedric points out is that the do block syntax is just
>>>> sugar for an anonymous function body. There is a plan to provide a more
>>>> convenient mechanism for ensuring finalization: #7721
>>>> <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2FJuliaLang%2Fjulia%2Fissues%2F7721&sa=D&sntz=1&usg=AFQjCNFvIk415gxqk8bmc7yh5IjJ917dkQ>.
>>>> So, pending syntax debating, you'd write this instead:
>>>>
>>>> Thanks for the link, I recall I had stumbled upon the discussion a
>>> while ago
>>>
>>>
>>>> fd = open(file)!
>>>> a = read(fd, ...)
>>>> b = read(fd, ...)
>>>> # finalize(fd) called when the scope ends
>>>>
>>>>
>>>> That would be great, also for simultaneous reading/writing of multiple
>>> files as you wrote in the discussion.
>>>
>>>
>>>> This would significantly reduce the number of situations where the do
>>>> block syntax is used for straight-line code, which I think largely
>>>> eliminates this issue.
>>>>
>>>> I believe in Python (which I only started using after Julia) you can say
>>>
>>> with open("one") as one, open("two", "w") as two:
>>>
>>> Cheers,
>>>
>>> ---david
>>>
>>>>
>>>> On Mon, Jun 20, 2016 at 10:35 AM, Cedric St-Jean <cedric...@gmail.com>
>>>> wrote:
>>>>
>>>>> I'm not sure why assignments are local, but I'd guess that it's for
>>>>> consistency. function foo(x, y) ... end is syntactic sugar for foo =
>>>>> (x,y)->..., and likewise do syntax is also sugar for creating a function
>>>>> and passing it as the first argument. Since
>>>>>
>>>>> function foo(x)
>>>>>     a = x
>>>>> end
>>>>>
>>>>> does not modify foo's parent scope (the global scope), it seems
>>>>> reasonable that local functions (do blocks) shouldn't modify their parent
>>>>> scope either. Here are other ways of writing the code you quoted:
>>>>>
>>>>> local a, b
>>>>> open(file) do fd
>>>>>  a = read(fd, ...) # will modify a and b in the parent scope
>>>>>  b = read(fd, ...)
>>>>> end
>>>>>
>>>>> comprehension = map(collection) do i
>>>>>   ## compute element[i]
>>>>>   element
>>>>> end
>>>>>
>>>>> Best,
>>>>>
>>>>> Cédric
>>>>>
>>>>>
>>>>> On Monday, June 20, 2016 at 7:54:10 AM UTC-4, David van Leeuwen wrote:
>>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> I regularly make the mistake described here
>>>>>> https://groups.google.com/d/msg/julia-users/UyCSm5Shyww/Udt67boT3CsJ,
>>>>>> i.e., i write
>>>>>>
>>>>>> open(file) do fd
>>>>>>   a = read(fd, ...)
>>>>>>   b = read(fd, ...)
>>>>>> end
>>>>>> ## a and b undefined.
>>>>>>
>>>>>> I get that the solution is
>>>>>>
>>>>>> a, b = open(file) do fd
>>>>>> ...
>>>>>>
>>>>>> Great.  I understand that you would want `fd` to be local, is this
>>>>>> the reason that every assignment is local?
>>>>>>
>>>>>> If `a, b = open() do ... end` is the recommended way of dealing with
>>>>>> this, I wonder if this approach could generalize to the for-block
>>>>>>
>>>>>> comprehension = for i in collection
>>>>>>    ## compute element[i]
>>>>>>    element
>>>>>> end
>>>>>>
>>>>>> as a multiline alternative to the [element for i in collection]
>>>>>> syntax.
>>>>>>
>>>>>> Cheers,
>>>>>>
>>>>>> ---david
>>>>>>
>>>>>
>>>>
>>

Reply via email to