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