On Thu, Dec 20, 2007 at 03:24:30PM -0800, Michael G Schwern wrote:
: Jonathan Scott Duff wrote:
: > On Thu, Dec 20, 2007 at 07:58:51AM -0500, Mark J. Reed wrote:
: >> I think the issue is that bare vars don't interpolate anymore, but
: >> they still have sigils of their own, so adding to the default interp
: >> syntax is too noisy:  ${$var} is not really much improvement over
: >> ${\(expr)}.
: > 
: > That's not quite accurate.  Scalars interpolate as they always have, but
: > aggregates need to be followed their respective bracketing construct
: > (e.g., "My array contains these items: @array[]")
: > 
: > The only "issues" that I see from the original email are:
: >     1. interpolating scalars but not code
: >     2. having to be more careful about what type of string you're using
: > 
: > Adriano answered #1 I think:  $yaml = Q:!c"{ $key: 42 }";
: > 
: > For the second one, if you're really just worried about how prevalent {}
: > appear in double-quotish strings, perhaps @Larry could be persuaded to
: > make them non-interpolative by default. (i.e., the adverb would be
: > required to make them interpolate)
: 
: That pretty much sums up my concern.

Well, it's certainly a concern that we thought about a lot when
designing the interpolation originally, so I rather suspect I'm highly
unlikely to change my mind on this one.  I've done (and read) a fair
amount of pugs programming since then, and while I can see that from a
Perl 5 perspective it looks like a problem, the situation doesn't arise
so often in practice, and when it does, it almost always results in
a compile-time error (which is a good thing).  Perl 6 balances a lot
of subtle issues differently than Perl 5 does, and these all factor into
whether closures should interpolate by default or not.  More on that
below.

But I will make one general remark at the start, which is that we
want Perl 6 programmer to look at curlies differently than Perl 5
programmers do.  In Perl 5, curlies were overloaded many different
ways, and rarely did they mean a closure by themselves.  In Perl 6,
it's almost always the case that bare curlies indicate a closure of
some sort throughout the rest of the language.  So the visual and
psychological import of seeing and typing curlies is intentionally
weighted rather differently.  Curlies are Perl 6's lambda.  Whenever
the user sees curlies, we want them to stop and think.  Even the
curlies used by the "built in" control operators are real lambdas
in the abstract, unlike in P5 where they are just hardwired in the
grammar.  Bare curlies in regex are now special too.

(Going the other way, you'll note that, in various other spots where
P5 uses curlies such as in \x{...} or $x{foo}, P6 prefers things like
\x[...] or $x<foo> instead, to avoid the visual implication of code.)

: The gyrations to turn off interpolating code... it's nice to know that exists
: but not something I want to ever have to remember or type or even consider my
: quoting context.

In general, I would never use negative form myself.  I'd be much more
likely to use qs// than qq:!c//.  But since the negative adverbial
forms are already available, it seems better to go ahead and provide
them to work as expected, even if they inspire occasional nausea.

As for the Q base form, it's not really there so much for end-use,
but to provide the bare form from which all other quotes and quote-like
forms are constructed, including forms like rx//.  Most user-defined
quotes should just be variants of q//.  Or just use bare '' quotes,
since it's still possible to interpolate using \qq[$foo].  This is
huffmanly suitable for quoting large stretches of code that need only
occasional interpolations.

: "Interpolate" vs "not interpolate" is enough, I have more
: important things to worry about while coding. [1]

And, in fact, this can be taken as an argument for making closures
interpolate consistently in double quotes, if they interpolate at all.
To the first approximation, double quotes do all interpolations
and single quotes do none (ignoring backslashes).  Positioning the
double quote semantics somewhere in the middle of the spectrum just
means you have to memorize which sequences interpolate by default
and which don't.  And we're trying to avoid the need for the user to
memorize arbitrary lists.

: Non-interpolative by default... well I don't exactly want the feature to go
: away either. [2]  I can see its uses [3] and it potentially eliminates some
: otherwise convoluted bits of code.  And again, I don't want to be thinking
: about flipping interpolation features on and off for each string.  Even qs//
: is more than I want to consider. [4]

In general, if you're interpolating a bunch of strings similarly,
you want to think about factoring that out.  One of the reasons
we're reserving backticks for users is so they can use them for
any specialty quotes, not just for qqx//.

: Code execution in a string is a very powerful thing, so it's not the sort of
: thing one wants to accidentally trigger.  Because it's using a common,
: innocent construct, this strikes me as being all too easy to trigger
: accidentally and unknowingly.
: 
: $ pugs -wle 'sub key() { 42 } sub value() { 23 }  say "{ key: value }"'
: 23
: 
: Whoops.

Seems like you had to work pretty hard to contrive an example
that would parse.  P6 is much pickier about random code than P5 is.

Naturally, the nature of what your quoting will influence how often
you might accidentally want literal curlies.  C derived languages
want them frequently, but I'd like to point out that normal English
text makes very little use of curlies, and a good deal of the
quoting in Perl programs happens to be of English.  Use of curlies
to interpolate into English is very easy to get used to.

And if you are quoting Perl code, you should generally be using
either single quote semantics (usually in a heredoc) or even better,
quasiquotes and macros.  Program text munging is fun, but if the text
is headed for an eval(), there's usually a better way.  We do allow
text-returning macros in P6, but since those are just source filters
writ small, we encourage people to return ASTs from quasiquotes
instead.  That's why they're called "hygeinic macros", after all...

Of course, quoting other languages will have different needs, but
that's why we allow custom quoting.  For quoting C you'd probably
want to stick with something that has qs semantics, since C
makes little use of $ but heavy use of {...}.

: It's also worth noting that ${} and @{} adding more context flexibility.  It
: appears {} only happens in list context right now, though I admit I'm not up
: on all the new contexts.

We have to reserve ${} as a syntax that catches bogus P5-like uses.
(And in fact, the standard P6 grammar specifically checks for it.)
The use of the very odd " ${foo}bar " in Perl 5 is now dead and gone.
It was one of the stranger uses of curlies borrowed from shell culture,
and syntactically an exceedingly exceptional exception--one of those
things that drives you nuts if you read toke.c in P5.

By contrast, in Perl 6 it falls out naturally from curly interpolation
that you can write it " {$foo}bar " instead, with no special rule,
only the general closure interpolation rule.

Another message pointed out that $() and @() fill much the same role,
but there are problems with relying on those for general expression
interpolation.  First, they're defined to fill a syntactic slot
identical to a normal variable.  And since normal variables interpolate
by looking for the longest meaningful term that ends in brackets,
$() would do the same.  That is, if you write

    " $($foo)<bar> "

it's the same as

    " {$foo<bar>} "

rather than the desired

    " {$foo}<bar> "

The other minor problem is that $() doesn't establish a scope, so a
C<my> declaration inside one would extend outside of the string.

As for the context issue, all interpolations are really in string
context at the end.  The decision to make {} provide list context
internally merely makes it easy to interpolate a list.  However,
this is transparent to any function that returns a single item.
And you can always use $() to force an explicit scalar context and
interpolate, assuming you are interpolating scalars.  Or use + or ~
inside to be explicit.

: [1] Note, I'm the sort of person that uses "" until I have a reason otherwise.

Well, me too, but P6 just provides a different set of reasons.  :)

To you and me, the fact that there are single quotes means there's
something there to hide.  But other people think the other way and
see double quotes as indicating there's something to interpolate.
I think PBP comes down on that side, but to me, single quotes are a
little harder to see.  And maybe there's some bias from seeing double
quotes used non-interpolatively in American English.

: [2] Now being able to turn it ON in a single quoted string would be handy, but
:     that's just because of my special case writing a lot of make generating
:     code where $ already has meaning.

Indeed, for specialized uses, you probably want to define your
own quotes.  S02 gives an example of this, and reserves all of
Unicode above Latin-1 for that purpose.  File-scoped declarations
are appropriate for such linguistic shenanigans, especially
if well commented.

: [3] Although a lot of them are handled by the interpolation of $obj.method()
:     which makes me happy.

But if you make that work, it doesn't prevent your other $
interpolations from happening if you turn on :s for the entire string.
You really need '\qq[]' in that case, or only interpolate closures, or
even @($foo) (shades of P5).

: [4] Which doesn't appear to be documented in S2.

It is, but by construction, not by exhaustive list.  See the sentence
that begins: "You may omit the first colon..."

As a last resort, you can even redefine how double quotes work.
"All is fair if you predeclare."  But I think some people would
construe that as antisocial.

Anyway, I'm pretty happy with the current design, and I think most
people will adapt to it pretty easily.  And I don't really mind if
they cuss me out a few times while they're learning.  :)

Larry

Reply via email to