On Sat, Jun 11, 2005 at 03:38:28AM -0000, David Formosa (aka ? the Platypus) 
wrote:
: From my exprence
: with perl5 and from playing around with pugs I've noticed that when
: eval(Str $evalstring) is used I mostly use it like this (in perl5)
: 
: eval "..."; Or
: 
: eval <<"__EVALEND__";
: ...
: __EVALEND__
: 
: It seems a natural analogy with s:e/.../.../; That I would be able to
: do the following.
: 
: q:2:e/.../;
: 
: q:2:e:to/__EVALEND__/;
: ...
: __EVALEND__;

There's a couple of little flaws with that line of reasoning.
The first is that there is a construct s:e/.../.../ in Perl 6 that
corresponds to Perl 5's s/.../.../e.  There isn't, because it can
be just as easily done with s/.../{...}/ using the curlies as the
generalized expression interpolator.  The second problem is that
you're thinking the first occurrence of /e in Perl 5 't actually
implies an eval.  It doesn't.  All it implies is that the right side
is to be treated as code.  So the hypothetical

    q:e/1+/

would actually be the equivalent of

    (1+)

rather than

    eval "1+"

which is why it would produce an error at compile time rather than
run time.

: > I personally don't think string eval should be made too easy|simple.
: 
: I would prefer a perl that didn't put speed bumps in the way just
: because it thought that it knew better.

And I would prefer that you not blame perl for my decisions.  :-)

Deciding where (and where not) to put the speed bumps is a pretty
good description of my job.  It's impossible to have a language without
bumps, so I reserve the right to put the necessary bumps where I think
they'll do the most good and/or least harm.

: The old Unix tradition of
: "Don't prevent something stupid incase someone intelligent finds a
: clever use for it".

In this case we're not preventing something either stupid or clever,
but rather suggesting a clearer way to do the clever thing.  It is
not good to have a retroactive /e like Perl 5 did, and in Perl 6 it's
better to have nearby context like {...} than distant context like
:e, especially insofar as {...} can be applied to bits of the string,
while a :e would only be able to operate on the string as a whole.

And quite apart from all that, anything as dangerous as "eval"
really ought not to be hidden in the details.  So in the Perl 5
case of /ee where you really are doing an eval for the second /e,
in Perl 6 you have to use {eval...} to make the real eval explicit,
and clearly distinguish the two things that Perl 5 confuses.

Larry

Reply via email to