One way to convince people that a new feature is worthwhile is to implement
an approximation of the feature, e.g. via a macro. If it then sees
widespread use, you have a strong argument in your favour.

Here's a possibility, using the customary "macro-in-front,
begin-end-around-everything" approach:

@loop begin for i in 1:10
        ...
        if i==8 break end
    end
finally
    info("did not break")
end

I'm sure the syntax needs cleaning up.

-erik



On Wed, Dec 9, 2015 at 10:47 AM, Seth <catch...@bromberger.com> wrote:

> Seems to me that this is just a more complex repeat...until or do...while
> bottom-conditional loop, which has already been discussed and rejected (to
> my disappointment).
>
>
> On Wednesday, December 9, 2015 at 7:05:43 AM UTC-8, Dan wrote:
>>
>> *A non-breaking Julia control-flow change to separate the One language from *
>>
>> *mortal languages, doomed to die
>> *
>> From a design patterns and DRY perspective it seems `for` loops together 
>> with the `break` statement
>>
>> are serving as a useful `try`/`catch` mechanism for non-error situations. A 
>> common pattern defines
>>
>> a variable before a `for` loop and tries to discern, using said variable, 
>> the circumstances of exiting
>>
>> the `for` loop. Leveraging the embedded mental construct of `try`/`catch` 
>> blocks, we can simplify
>>
>> this repeating pattern and make it easier and more readable.
>>
>> The syntax can look as follows:
>>
>> for ...(loop vars here)...
>>
>>     ...(local vars here)...
>>
>>     ...
>>
>>     if ...
>>
>>         break <value>
>>
>>     end
>>
>>     ...
>>
>> catch <symbol>
>>
>>     ...(access local/loop vars and <symbol> here)...
>>
>>     <for-value>
>>
>> finally
>>
>>     ...(access local/loop vars here)...
>>
>>     <for-value>
>>
>> end
>>
>>      Syntax changes worthy of consideration should be self-explanatory to 
>> many, as I hope this suggestion is.
>> But an example should help:
>>
>> After change:
>>
>> for line in eachline(f)
>>
>>     fields = split(line)
>>
>>     status = fileds[2]
>>
>>     if status=="FAIL"
>>
>>         break
>>
>>     end
>>
>> catch
>>
>>     println("Test $(fields[1]) failed with reason $(fields[3])")
>>
>> finally
>>
>>     println("Test successful!")
>>
>> end
>>
>> Before change:
>>
>>
>>
>> fields = []
>>
>> didfail = false
>>
>> for line in eachline(f)
>>
>>     fields = split(line)
>>
>>     status = fields[2]
>>
>>     if status=="FAIL"
>>
>>         didfail = true
>>
>>         break
>>
>>     end
>>
>> end
>>
>> if didfail
>>
>>     println("Test $(fields[1]) failed with reason $(fields[3])")
>>
>> else
>>
>>     println("Test successful!")
>>
>> end
>>
>>              The above example does not use the `break <value>` suggestion. 
>> With multiple `break` circumstances it should
>>
>> be useful to have separate code for each circumstance. One option is to 
>> replicate the `try`/`catch` form
>>
>> with a `<value>` passed as `<symbol>`, another would be to use `catch 
>> <value>` to run catch block
>>
>> if "`break <value> == catch <value>`" (the `<value>` can be a human readable 
>> symbol). A direct jump in the
>>
>> LLVM code to the appropriate `catch` block would be an easy optimization to 
>> implement.
>>
>> Another issue to consider is the return value of a `for` block. The 
>> suggestion above adds the option to change
>>
>> the current default `nothing` return with `<for-value>` in the new optional 
>> blocks.
>>
>> Notice that the `catch` and `finally` blocks are completely optional and 
>> therefore backward compatibility
>>
>> is easy. Additionally there are no additional keywords and block nesting 
>> would not conflict with `try`/`catch`.
>>
>> Hey, Julia is still < 0.9 so there is still time for some change.
>>
>> Obligatory Disclaimerism:
>>
>> 1. This has already been considered before by **name**/**issue**.
>> 2. Before suggesting I should have studied past discussions more.
>> 3. Other langauges actually already have this... bla bla.
>> 4. This post is what it is.
>>
>>
>> This suggestion is also readable in github markdown in the gist: 
>> https://gist.github.com/getzdan/75136f130c6f8ffeb60e
>>
>>
>> Feedback/Pointers/Gotchas welcome, of course.
>>
>>


-- 
Erik Schnetter <schnet...@gmail.com>
http://www.perimeterinstitute.ca/personal/eschnetter/

Reply via email to