ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> perl6-language
perl6-language
BEGIN {...} and IO
by Ingo Blechschmidt other posts by this author
Jun 13 2005 8:09AM messages near this date
Re: Anonymous macros? | Re: How much do we close over?
Hi,

  # No problem:
  my $data = BEGIN {
    my $fh = open "some_file" err...;
    =$fh;
  };

  # Problem;
  my $fh = BEGIN { open "some_file" err... };
  # Compile-time filehandle leaked into runtime!
  say =$fh;

In Perl 5, this wasn't a problem, as compilation and execution happended
(most of the time) in the same process.

But in Perl 6, compilation and execution can happen in different
processes or even on different computers, so probably the snippet
should raise an error, preferably at compile-time.

My real question: How do I raise an error if objects of my own classes
leak into runtime? I.e.:
  # This should work:
  my $foo = BEGIN { MyClass.new.get_some_value };

  # But this shouldn't:
  my $foo = BEGIN { MyClass.new }.get_some_value;

I can see some possibly answers:

* There should be some bool $?COMPILING:

  class MyClass {
    has Bool $.created_at_compile_time;

    submethod BUILD () {
      $.created_at_compile_time = $?COMPILING;
    }

    method get_some_value () {
      if $.created_at_compile_time and not $?COMPILING {
        die "...";
      } else {
        ...;
      }
    }
  }

  Pro: Great flexibility (maybe there're two methods, from which only
       one has the restriction that the object may not leak into
       runtime).
  But: The compiler can't check at compile-time if leaking into
       runtime is allowed.

* There should be a special role:

  class MyClass does dont_leak_into_runtime {
    method get_some_value () {...}
  }

  Pro: The compiler can check at compile-time if leakinto into runtime
       is allowed.
  But: You don't have as much flexibility as with $?COMPILING.

* There's a boolean property may_leak_into_runtime every object has,
  with a default of true.
  BEGIN and CHECK then check if the object they're about to return has
  .may_leak_into_runtime set to false -- if that's the case, die:

  class MyClass does may_leak_into_runtime(false) {
    method get_some_value () {...}
  }

  my $foo = BEGIN { MyClass.new }.get_some_value; # really means
  my $foo = BEGIN {
    my $result = MyClass.new;
    $result.may_leak_into_runtime ?? $result :: die "...";
  }.get_some_value;

  Pro: Great flexibility, easy to use


FWIW, I like #3 the best.


--Ingo

-- 
Linux, the choice of a GNU | Perfection is reached, not when there is no
generation on a dual AMD   | longer anything to add, but when there is
Athlon!                    | no longer anything to take away.           

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved