--- Dave Whipp <[EMAIL PROTECTED]> wrote:
> "Dulcimer" <[EMAIL PROTECTED]> wrote
> > > But exposing the object like that still bothers be: I shouldn't
> > > need the $tmp, nor the .new.
> >
> > I'm not so sure I agree with losing the new(). I kinda like that
> > just for readability. Less isn't always more. :)
> >
> > Ok, how about this:
> >
> >   sub slow_fn {
> >     temp &_.timer is last { .stop } = new Timer (
> >        secs => 1, code => { .reset += print "." }
> >     );
> >     return slow_fn_imp @_;
> >   }
> 
> Wrong semantics: First, you're assuming that .reset is an attribute,
> rather than a command (Yes, I believe the command/query separation,
> where possible).

Ok. And that leads to the next thing --

> Second, My intention was that if C<print> ever fails (e.g. broken
> pipe), then I'd stop resetting the timer. Your program meerly stops
> incrementing the timeout.

Agreed. 

> Even if we assume that the "temp &_.prop" thing works, I'm not sure
> I'd want it littering my code. I could see it being used in a macro
> defn though.

Maybe. It isn't pretty, but I've seen worse. Hell, I've posted worse.
:)

> > Dunno -- I see what you're doing, but it's a little *too* helpful.
> > I'd rather see a few more of the engine parts on this one.
> 
> We can expose a few more parts by having the macro return the timer
> object, so you could write:
> 
> my $timer = timeout(60) { ... };

Ok, poorly phrased on my part. I just meant I'd like to visually see
more of what's going on in the code. In other words, I'm not fond of
the syntax proposal. I find C<timeout(60) { ... }> too terse, and would
rather see a more verbose version. Merely a style issue, though. Still,
your response to what it *looked* like I meant is a good idea, too.

> > > A semantic question: what output would you expect for this:
> > >
> > > sub silly {
> > >    timeout(5) { print ".HERE."; sleep 4; print ".THERE." };
> > >    for 1..5 -> $count { sleep 2; print "$count" };
> > > }
> > > possible answers are
> > >    12.HERE.34.THERE.5
> > > or
> > >    12.HERE..THERE.345
> > > I'm thinking probably the latter, because its easier to launch a
> > > thread in the codeblock than to un-launch it.
> >
> > un-launch? If they're threaded, aren't they running asynchronously?
> > I see 12.HERE.34.THERE.5 as the interleaved output. I have no idea
> > what you mean by "un-launch", sorry.
> 
> Sorry, it was my feeble attempt at humor.

lol -- and I was too dense to get it. :)

> What I was getting at is that, if we assume the codeblock executes
> asa coroutine, then you'd get the latter output. If you wanted a
> thread, you could write:
> 
>   timeout(5) { thread { ... } };
> 
> but if we assume that the codeblock is launched as an asynchronous
> thread, then there is no possible way the coerce it back into the
> coroutine (i.e. to "un-launch" it).

Ah. Ok, but if that's the case, you could as easily write it 

   timeout(5) { coro { ... } };

and have the compiler build it accordingly. The same logic works either
way from that end. Thread seem more sensible for a timeout, but as a
general rule I'd probably prefer to see implicit coro's rather than
implicit threads as the default.

> Now here's another semantics question: would we want the following to
> be valid?
> 
> sub slow
> {
>    timeout(60) { return undef but "Error: timed out" };
>    return @slow_imp;
> }

Dunno....returns from a single routing that are in different threads
could produce some real headaches.

> How about:
> 
> sub slow {
>    timeout(60) { 
>       throw TimeoutException.new("Error: slow_fn timed out")
>    };
>    return @slow_imp;
> }

I like thata lot better, but I'm still not sure how it would fly.
(Sorry for the reformat, btw -- got pretty cramped on my screen.)

__________________________________
Do you Yahoo!?
Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
http://calendar.yahoo.com

Reply via email to