Piers Cawley writes:
: Hmm... making up some syntax on the fly. I sort of like the idea of
: being able to do
: 
:     class File;
:     sub foreach ($file, &block) is Control {
:         # 'is Control' declares this as a control sub, which, amongst
:         # other things 'hides' itself from caller. (We can currently 
:         # do something like this already using Hooks::LexWrap type
:         # tricks.

Maybe, but we'll need more explicit parsing control for other things,
so this may fall out of that.

:         open my $fh, $file or die $!; POST { close $fh }

More like:

    my $fh = open $file or die;
     
:         while (<FILE>) {
:             my @ret = wantarray ?? list &block() :: (scalar &block());
:             given $! {
:                 when c::RETURN { return wantarray ?? @ret :: @ret[0] }
:             }
:         }

That "given $!" would have to be a CATCH, or the code would never be
executed on a control exception.

: This is, of course, dependent on $! not being set to a RETURN control
: 'exception' in the case where we just fall off the end of the block.

I'd say that's correct.

: It's also dependent on being able to get continuations from caller
: (which would be *so* cool

Hmm, might not need to go that far.

: > allow this:
: >
: >     File.foreach('/usr/dict/words') { print }
: 
: Sounds plausible to me.

We're not using Ruby syntax here.  Any closure is a real argument with
a real formal argument name, and is called via ordinary &block(...)
syntax, not yield.

: > or would the prototype be (&file, &block)?
: 
: I prefer the ($file, &block) prototype.

I don't see why it would ever be &file.  It's just a string.

: > And would this:
: >
: >     my $caller = caller;
: >     File.foreach('/usr/dict/words') { 
: >         print $caller eq caller ? "ok" : "not ok" 
: >     }
: >
: > be ok or not ok?  It has to be ok if mywhile is going to emulate a
: > while loop.
: 
: In theory there's nothing to stop you writing it so that that is the
: case. I'd like it to be as simple as adding an attribute to the
: function declaration (and if it isn't that simple out of the box, it
: will almost certainly be, if not trivial, at least possible to write
: something to *make* it that simple...)

Precisely.

Larry

Reply via email to