Alan Manuel Gloria asked:
> > How about the cond-style if of Arc?
> > (if
> > (condition1)
> > (dothis1)
> > (condition2)
> > (dothis2)
> > (default))

Sweet-expressions _can_ handle this, in several ways,
but I agree that they aren't optimal.  The format doesn't help
show "hidden" pairings inside a list.

Clearly, it'd be possible to add or modify syntax to better handle
cases where you'd like multiple lines to be spliced together to
permit "hidden" structures inside a list of items.
Both Arc and  SMT-LIB show cases where
you'd like to have spliced pairs (e.g., condition/result or
attribute_name/values). But any such mechanism would need to be simple.

Allowing "\" at the end of the line to mean "continue line"
is at least simple. That wouldn't cover all use cases, though.
A problem with the simple "splice line" approach is that
it doesn't handle spliced-in pairs where at least one of the
pairs is so complex that you'd like to keep using
normal indentation processing inside them.

But I haven't been able to think of a syntax that neatly
handles this case, and is simple enough to be worth the trouble.
This message has 3 ideas (below) - maybe someone here can
think of something better?

Let's start with 2 concrete cases, based on
Arc's "if" and SMT-LIB's labelled-parameters
(which are quite similar to Common Lisps's, so the
latter is hardly an unknown case):
(if a (b (xxxxxxx yyyyyyy zzzzzzz) (xxxxxxx yyyyyyy zzzzzzz))
     c d
     (e (xxxxxxx yyyyyyy zzzzzzz) (xxxxxxx yyyyyyy zzzzzzz))
         (f (xxxxxxx yyyyyyy zzzzzzz) (xxxxxxx yyyyyyy zzzzzzz))
     g h
     i)
(f :parameter1 value-for-1-that-is-really-long
   :parameter2  (xxxxxxx yyyyyyy zzzzzzz (q r z))
   :parameter3 value-for-3-that-is-really-long)


First, the "obvious" representation in sweet-expressions is:
if
  a 
  b
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  c
  d
  e
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  f
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  g
  h
  i
f(:parameter1 value-for-1-that-is-really-long
   :parameter2  xxxxxxx(yyyyyyy zzzzzzz q(r z))
   :parameter3 value-for-3-that-is-really-long)

Notice that on the "if", the format does not
even HINT that there is a pairing, e.g., for g and h. Also,
in "parameter2"'s value we can't use indentation any more to
express structure... we're back to parens.  So we can use
(...) to disable indentation processing, but then we
completely lose indentation processing inside it.

Adding support for "\" to disable indentation processing
can help the attributename-value stuff, as long as it's short,
but otherwise it doesn't help much in these examples
(I CHOSE these examples to thwart this idea, so that's expected):
if
  a b
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  c \
    d
  e
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  f
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  g \
    h
  i
f(:parameter1 value-for-1-that-is-really-long \
   :parameter2  xxxxxxx(yyyyyyy zzzzzzz q(r z)) \
   :parameter3 value-for-3-that-is-really-long)



Here are three approaches, all of which are bad :-).

APPROACH 1:
One approach would be to add some sort of
"splicing" operator for lines, when performing indentation
processing.  There's precedence
in Lisp for this, of course; "," typically inserts the
value into a list, but ",@" splices it in.  So it's
understandable that there might need to be some
sort of 'splicing' operator.  Let's call it "@@",
though "splice", "ungroup" (opposite of "group"), or
other names are possible.  Basically, this operator would
cause the line to be spliced into its parent, INSTEAD of
becoming a new sublist.  If there are children, then
presumably they are children of the last-named expression.

E.G., perhaps something like this:
if
  @@ a b
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  @@ c d
  e
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  f
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  @@ g h
  i
f(:parameter1 value-for-1-that-is-really-long
   @@ :parameter2  xxxxxxx
     yyyyyyy zzzzzzz q(r z)
   @@ :parameter3 value-for-3-that-is-really-long)


This would mean that:
if
  @@ a b
      1 2 3
  @@ c
      4 5 6
  @@    d
       7 8 9
  @@ e

Would become
(if a (b 1 2 3) (c 4 5 6)

Right now, I think that such a "splicing" operator
would be WAY too complicated.  But maybe someone
can come up with a variant that is simpler to understand
(or, convince everyone that it's not so bad).

APPROACH 2:
Maybe what's needed is an infix "splicing" operator that you place
BETWEEN items, saying that these items will be spliced into
the larger list enclosing them (instead of creating their own list).
You'll need a way to escape this (ugh), but ignoring that problem,
let's see how that looks (if "@@" is used with nothing before it,
it's ignored):
if
  a @@ b
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  c @@ d
  e
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  @@ f
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  g @@ h
  i
f :parameter1 value-for-1-that-is-really-long
   :parameter2  @@ xxxxxxx
     yyyyyyy zzzzzzz q(r z)
   :parameter3 @@ value-for-3-that-is-really-long


APPROACH 3:
A more radical approach would be a different
version of sweet-expressions that didn't disable
indentation processing when it encounters "(", but
DID allow you to add "\" at the end to combine lines
(effectively disabling indentation processing for the NEXT line).
Such a version would not be backwards-compatible with
existing sweet-expressions, which is REALLY unfortunate.
That doesn't even seem to help much:
if
  a \
     b
        xxxxxxx yyyyyyy zzzzzzz
        xxxxxxx yyyyyyy zzzzzzz
  c \
    d
  e
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  f
    xxxxxxx yyyyyyy zzzzzzz
    xxxxxxx yyyyyyy zzzzzzz
  g \
    h
  i
f(:parameter1 value-for-1-that-is-really-long \
   :parameter2  xxxxxxx(yyyyyyy zzzzzzz q(r z)) \
   :parameter3 value-for-3-that-is-really-long)
I think this particular approach is a train wreck
trying to happen; it's way too easy to misplace
backquotes, and I don't think it helps much.



Thoughts?

--- David A. Wheeler

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Readable-discuss mailing list
Readable-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/readable-discuss

Reply via email to