This and other RFCs are available on the web at
  http://dev.perl.org/rfc/

=head1 TITLE

Beyond the amnesic eval

=head1 VERSION

  Maintainer: Stéphane Payrard <[EMAIL PROTECTED]>
  Date: 29 Sep 2000
  Mailing List: [EMAIL PROTECTED]
  Number: 351
  Version: 1
  Status: Developing

=head1 ABSTRACT

An unscoped eval is needed. It is part of the necessary steps to
make Perl palatable as an interactive shell.

=head DESCRIPTION

A perl shell, beyond its intrinsic utility, will be a great
interactive learning tool.  The absence of unscoped eval makes perl
based shells unattractive because they must be implemented as a scoped
eval around each command line. As a result most of the interesting
context is lost.


In command line mode, an interpretor reads a line typed by the user
then evaluates it. And so for the next lines, ad nauseam.  It is only
natural to propagate the context from one line to another. This is
what make possible inteesting interactive uses.

This is not what happens in perl5 because C<eval> is always scoped.
The lost context is: the current package, special variables sets by
regexp ($1...), scoped variables (lexical and local).


A basic CLI can be built as a oneliner in classic Perl, the perl
debugger invoked by C<perl -de 0> is a glorified but specialized
command line. But without unscoped eval. It does not cut it.

An example of a frustrating session where a naive user expect a
unscoped eval:

    DB<1> package FOO

    DB<2> print __PACKAGE__
  main
    DB<3> $_='foo'

    DB<4> print m/(foo)/
  foo
    DB<5> print $1

    DB<6> my $foo = 'bar'

    DB<7> print $foo

    DB<8> local $foo = 'bar'

    DB<9> print $foo


Certainly, one can get away by cramming a lot of stuff in one line.
But the idea of granular interactivity is lost:


    DB<13> package FOO;  print __PACKAGE__
  FOO
    DB<14>  $_='foo'; print m/(foo)/
  foo
    DB<15> local $foo = 'bar'; print $foo
  bar
    DB<16> my  $foo = 'bar'; print $foo
  bar


=head2 Syntax

I propose the unary + as a marker that differentiates unscoped eval
from classic (scoped) eval. Or one may consider a explicit keyword.
I can't find a satisfactory one.


Classic eval:

 eval {}
 eval ""

Unscoped eval

 +eval {}
 +eval ""

=head1 IMPLEMENTATION

=head1 REFERENCES

Refeences to forthcoming RFCs.

There are other features needed to make perl6 a good shell.  They can
be mode-dependant so as not to interfere with perl as a programming
language.


Command line languages make heavy usage of litterals. In perl6 command
line mode, the default should be to interpret most strings as
litteral. For example C</etc/> should be a string that will
interpreted as a filename.  "Taking things litterally" will describe
what change of syntax this implies.

"User defined microsyntax" goes one step further and will propose user
defined litterals to avoid writing complex constructors.


Reply via email to