# Call to arms: lambda-case is stuck and needs your help

Simon Marlow marlowsd at gmail.com
Mon Jul 9 14:44:08 CEST 2012

On 07/07/2012 05:08, Tyson Whitehead wrote:

> PS:  To be fully precise, the modified layout decoder in 9.3 would be
>
>    L (<n>:ts)     i (m:ms) = ; : (L ts n (m:ms))   if m = n
>                            = } : (L (<n>:ts) n ms) if n < m
>    L (<n>:ts)     i ms     = L ts n ms
>    L ({n}:<n>:ts) i ms     = { : (L ts n (n:ms))   if n > i (new rule)
>    L ({n}:ts)     i (m:ms) = { : (L ts i (n:m:ms)) if n > m  (Note 1)
>    L ({n}:ts)     i []     = { : (L ts i [n])      if n > 0  (Note 1)
>    L ({n}:ts)     i ms     = { : } : (L (<n>:ts) i ms)       (Note 2)
>    L (}:ts)       i (0:ms) = } : (L ts i ms)                 (Note 3)
>    L (}:ts)       i ms     = parse-error                     (Note 3)
>    L ({:ts)       i ms     = { : (L ts i (0:ms))             (Note 4)
>    L (t:ts)       i (m:ms) = } : (L (t:ts) i ms)   if m /= 0 and parse-error(t)
> (Note 5)
>    L (t:ts)       i ms     = t : (L ts i ms)
>    L []           i []     = []
>    L []           i (m:ms) = } : L [] i ms         if m /= 0 (Note 6)
>
>
> As before, the function 'L' maps a layout-sensitive augmented token stream to
> a non-layout-sensitive token stream, where the augmented token stream includes
> '<n>' and '{n}' to, respectively, give the indentation level of the first token
> on a new line and that following a grouping token not followed by '{'.
>
> This time though, we allow the '{n}' '<n>' sequence (before it was supressed
> to just '{n}').  We also add a new state variable 'i' to track the indentation
> of the  current line.  The new rule now opens a grouping over a newline so
> long as the indentation is greater than the current line.
>
> Upon a less indented line, it will then close all currently open groups with
> an indentation less than the new line.

It's a little hard to evaluate this without trying it for real to see
whether it breaks any existing code.  However, unless there are very
strong reasons to do so, I would argue against making the layout rule
*more* complicated.  I find the current rule behaves quite intuitively,
even though its description is hard to understand and it is virtually
impossible to implement.

I now think '\' is too quiet to introduce a new layout context.  The
pressing need is really for a combination of '\' and 'case', that is
single-argument so that we don't have to write parentheses.  I think
'\case' does the job perfectly.  If you want a multi-clause
multi-argument function, then give it a name.

Cheers,
Simon