Rick Delaney wrote:

> Why not something like
>
> Single-line         Block
> ===========         =====
> [<<<]               {<<<}
> [>>>]               {>>>}
> [|||]               {|||}
> [''']               {'''}
>
> which distinguishes the 2 main field types and gives us only the 4
> justifiers we need?
>
> I can appreciate the elegance and power of bracketing the fields even
> though it screws up one- and two-character fields.  And while it's nice
> to be down from 3 metacharacters in Perl 5 formats to 1 it doesn't feel
> quite worth it when every justification specifier must be doubled.
>
> Having two sets of field delimiters means that if a new justifier is
> added we need only come up with one character for it.  It also clearly
> distinguishes the field type for two-character fields.  Neither of these
> is a strong argument for changing the existing design but I'm wondering
> why the first table above would be easier to learn/remember than the
> second.

I did think long and hard about this issue, and considered the very points
you make -- at some length. In the end I decided that either (...) or
[...] were simply too common in literal text for it to be reasonable to
use them as delimiters for block fields.

I *suppose* an argument might be made that the "multiplicity" connotations
of «...» might make them a suitable alternative, but can you imagine the
screams of protest from the seven-bit lobby?

Moreover, as I looked at various examples, it became obvious to me that
differentiating the behaviour of fields only by their delimiters made it
much harder to quickly visualize what a particular format would do. And
hence harder to maintain that formatting code.

For example, if we compare:

    print form
        "{<<<<<<<<<<<} [<<<<<<<<<<<<<<<<<<<<<] {<<<<<<<<<<<<}",
         $title,       $info,                  $reference,
        "{<<<<<<<<<<<} {<<<<<<<<<<<<<<<<<<<<<} [<<<<<<<<<<<<]",
         $subtitle,    $source,                $cross_refs;

with:

    print form
        "{<<<<<<<<<<<} {[[[[[[[[[[[[[[[[[[[[[} {<<<<<<<<<<<<}",
         $title,       $info,                  $reference,
        "{<<<<<<<<<<<} {<<<<<<<<<<<<<<<<<<<<<} {[[[[[[[[[[[[}",
         $subtitle,    $source,                $cross_refs;


for me, at least, it's a great deal easier to distinguish the block fields and single-line fields in the second version, and therefore to predict at a glance what the final text will look like.

In the end it was a decision that might have gone either way, but one that
I made consciously and for what I consider to be good reasons.

And, of course, the beauty of C<form> is that, like so much of the rest of Perl 6, if you don't like the syntax I chose, you can always create a module to replace it with the syntax you'd prefer:

    module Form::Less::Travailed {
        my sub translate (Str $_ is copy, [EMAIL PROTECTED]) {
            s/^\[/{/;
            s/\]$/}/;
            tr/<>|'/[]I"/;
            return $_;
        }

        use Form :field{ /\[    .*?    \]/ => &translate,
                         /\{ <[][I"]>+ \}/ => { die "Ugly field: $^yuck" },
                       };

        sub form is exported {...}
    }

Or, in Perl 5:

package Perl6::Form::Less::Travailed;

    sub translate {
        for (shift) {
            s/^\[/{/;
            s/\]$/}/;
            tr/<>|'/[]I"/;
            return $_;
        }
    }

    use Perl6::Form {
        field => { qr/\[   .*?   \]/x => \&translate,
                   qr/\{ [][I"]+ \}/x => sub { die "Ugly field: $_[0]" }
                 },
    };

use Perl6::Export;

sub form is exported;

1;



Damian




Reply via email to