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