Maybe it's Just Nothing (was: Look-ahead arguments in for loops)

2005-09-29 Thread Luke Palmer
On 9/29/05, Austin Hastings <[EMAIL PROTECTED]> wrote:
> Matt Fowles wrote:
> >
> >for (1, 2) -> ?$prev, $cur, ?$next {
> >   say "$prev  -> $cur" if $prev;
> >   say $cur;
> >   say "$cur -> $next" if $next;
> >   say "next";
> >}
> >
> [...]
>
> I assume so because it's the only execution path that seems to work. But
> that would be assuming there was always at least one non-optional
> binding. Given that Luke's against all-optional signatures, too, I'll
> withdraw that part of the suggestion. And with at least one required
> binding, then there's no reason that we can't have the window extend on
> both sides of the current value.
>
> Luke?

Hm, I'm being called upon now.

Well, then I start to ask questions like:

for 1..10 -> ?$a, $b, ?$c, $d, ?$e {...}

Which simply doesn't make any sense to me.  Also, figuring out such
things (as is the case with lookbehind argumentS) needs a little bit
too much knowledge about the signature of the function you're viewing.

So instead of sticking that in the signature, we could do it with
adverbs on for:

for 1..10, :lookbehind(1) :lookahead(1) -> $cur, ?$left, ?$right {
...
}

You'll note that, unfortunately, the lookbehind has to come *after*
the cur argument because it must be optional.  Hmm... actually, that
doesn't work, because at the beginning of the list you won't have a
$left, and at the end you won't have a $right.

It's possible that it's time to start kicking undef into gear.  Until
now in Perl culture, undef has been just a little bit special, with
people not fearing to put it in lists and data structures.  There may
be benefit in making it more special, so that people shouldn't define
their own meaning for it.  Making exceptions undefs are a step in that
direction.  If we take another step in that exact same direction, we
could make undefs exceptions (the converse of before):

sub foo() {
return undef;# almost the exact same as "fail"
}

That is, under "use fatal", all undef return values are converted into
exceptions.

That was somewhat beside the point, but not really.  If undefs are a
bit taboo--for example, actually writing "undef" in most code is
considered bad style--then we can steal them for the language's
purposes, such as passing to a for block as lookbehind and lookahead
parameters when you're near the beginning or end of a list.

It seems like I'm making a pretty big deal out of just passing undef
when there is no look-behind/-ahead, but I really want to be able to
distinguish between "there was an undef in the list" and "we're almost
done, so there was actually nothing here".  Of course, I still don't
get to distinguish those, but a list with an undef in it becomes much
less common.

The way we can help ease the pain of undef not being available for
user purposes anymore is to allow easy manipulation of Either types. 
If you define "easy" weakly, then union types give us that:

union Maybe[::t] (Nothing, Just(::t));

Mmm, Haskellicious.  But of course you wouldn't need to declare your
types everywhere because of Perl's dynamic typing/type inference
(depending on your mood).  Nothing is nice, but I wouldn't call
working with Just "easy" for Joe Schmoe.  It's nice and safe, but it's
annoying sometimes.  What I might think I want is:

union Maybe[::t] (Nothing, ::t);   # not legal union syntax

You lose a lot with that, though.  For instance, Just(Nothing) becomes
unrepresentable.  And consequently, nested calls to things that return
Maybes become woosy.  So that's not a good idea.

So allowing the definition of Maybe is a good start.   But it's
difficult to know whether Perl programmers will put up with it.  It's
easier--lazier--just to use undef.

Maybe we ought to call the whole thing off.  Undefs have no stigma,
and everything is as usual.  If you want to iterate over a list with
lookahead and lookbehind, you shouldn't have put undefs in your list.

The last thing to do, if we want to keep the undef status quo, is to
define Maybe in the language and use it for things like for's
lookahead binding.  It's kind of like a "formal undef", something like
"listen, it's pretty common that I won't give you a value here, so I'm
going to mark it specially when I both do and do not".  Again, not
easy enough; too much abstraction to think about for an everyday task.
 I think my favorite so far is the previous paragraph's resolution. 
Just because it's my favorite doesn't mean I'm happy with it.

Oh, right, and as for my favorite actual usage of for:

for @list, :lookbehind(2) :lookahead(1)
-> $behind1, $behind2, $value, $ahead {
...
}

Luke


Re: Look-ahead arguments in for loops

2005-09-29 Thread Austin Hastings
Matt Fowles wrote:

>Austin~
>
>On 9/29/05, Austin Hastings <[EMAIL PROTECTED]> wrote:
>  
>
>>Plus it's hard to talk about backwards. If you say
>>
>>for @l -> ?$prev, $curr, ?$next {...}
>>
>>what happens when you have two items in the list? I think we're best off 
>>using signature rules: optional stuff comes last.
>>
>>
>
>I disagree, I think that is an easy call
>
>for (1, 2) -> ?$prev, $cur, ?$next {
>   say "$prev  -> $cur" if $prev;
>   say $cur;
>   say "$cur -> $next" if $next;
>   say "next";
>}
>
>should print
>
>1
>1 -> 2
>next
>1 -> 2
>2
>next
>
>  
>
Did you mean:

next
1  -> 2 # two spaces

there?

I assume so because it's the only execution path that seems to work. But
that would be assuming there was always at least one non-optional
binding. Given that Luke's against all-optional signatures, too, I'll
withdraw that part of the suggestion. And with at least one required
binding, then there's no reason that we can't have the window extend on
both sides of the current value.

Luke?

=Austin


>Matt
>--
>"Computer Science is merely the post-Turing Decline of Formal Systems Theory."
>-Stan Kelly-Bootle, The Devil's DP Dictionary
>
>  
>



Re: Look-ahead arguments in for loops

2005-09-29 Thread Luke Palmer
On 9/29/05, Austin Hastings <[EMAIL PROTECTED]> wrote:
> Luke Palmer wrote:
> >>This is an interesting idea.  Perhaps "for" (and "map") shift the
> >>minimum arity of the block from the given list and bind the maximum
> >>arity.  Of course, the minimum arity has to be >= 1 lest an infinite
> >>loop occur.

> Or not. We've already seen idioms like
>>
>   for (;;) ...
>
> If you specify your minimum arity as 0, then you're obviously planning to 
> deal with it. This presumes that iterators can handle behind-the-scenes 
> updating, of course.

Well, I see two reasons for not allowing arity zero.  First, I think
it's too easy to come up with a function with minimum arity zero:

my @lengths = @list.map:&length   # oops, infinite loop

Second, you don't get anything by doing this:

for @list -> [EMAIL PROTECTED] {
   ...
}

As it's equivalent to:

loop {
...
}

Where you use @list instead of @items.

Luke


Re: Look-ahead arguments in for loops

2005-09-29 Thread Matt Fowles
Austin~

On 9/29/05, Austin Hastings <[EMAIL PROTECTED]> wrote:
> Plus it's hard to talk about backwards. If you say
>
> for @l -> ?$prev, $curr, ?$next {...}
>
> what happens when you have two items in the list? I think we're best off 
> using signature rules: optional stuff comes last.

I disagree, I think that is an easy call

for (1, 2) -> ?$prev, $cur, ?$next {
   say "$prev  -> $cur" if $prev;
   say $cur;
   say "$cur -> $next" if $next;
   say "next";
}

should print

1
1 -> 2
next
1 -> 2
2
next

Matt
--
"Computer Science is merely the post-Turing Decline of Formal Systems Theory."
-Stan Kelly-Bootle, The Devil's DP Dictionary


Re: Exceptuations, fatality, resumption, locality, and the with keyword; was Re: use fatal err fail

2005-09-29 Thread Yuval Kogman
On Thu, Sep 29, 2005 at 13:52:54 -0400, Austin Hastings wrote:

> You already know that "err" is the low-precedence version of //, right?
> What replaces that? I like "default" or "defaults" myself,

Yes, he proposed 'dor'.

As I see it err is like this:

sub infix: ($lhs is delayed, $rhs is delayed) { # we really need 
thunk parameters
return $lhs dor $rhs;
CATCH { return $rhs }
}

So really 'err' is just 'dor' with an added error silencer.

> On the primary hand, I don't like the idea of using "err" as a try/catch
> because that's putting exception handling in line with the primary code.
> See FMTYEWT below.

Isn't

no fatal;

my $fh = open $file or die;
...
my $fh = open $file or next;

also putting exception handling in line with the primary code?

Isn't that useful?

Exception handling should be put in wherever there is well defined
behavior on how error conditions should be dealt with.

It's Perl's job to make this as easy as possible for the programmer.

If we have a module called File::Slurp::Some, which doesn't really
care if some of the files don't exist, it's code would, IMHO be
much more readable with

open $file err next;

than a catch block.

The reason for this is that a catch block is always detached from
the code.

However, if the error is part of the normal flow (it is no longer
exceptional for the file to not exist), what benefit does the added
detachment give?

> A million years ago, $Larry pointed out that when we were able to use
> 'is just a' classifications on P6 concepts, it indicated that we were
> making good forward progress. In that vein, let me propose that:
> 
> * Exception handling, and the whole try/catch thing, IS JUST An awkward
> implementation of (late! binding) run-time return-type MMD.

Exception handling is just continuation passing style with sugar.

Have a look at haskell's either monad. It has two familiar keywords
- return and fail.

Every statement in a monadic action in haskell is sequenced by using
the monadic bind operator.

The implementation of >>=, the monadic bind operator, on the Either
type is one that first check to see if the left statement has
failed. If it does, it returns it. If it doesn't it returns the
evaluation of the right hand statement.

Essentially this is the same thing, just formalized into a type

> Specifically, if I promise you:
> 
>   sub foo() will return Dog;
> 
> and later on I actually wind up giving you:
> 
>   sub foo() will return Exception::Math::DivisionByZero;

In haskell:

foo :: Either Dog Exception::Math::DivisionByZero

e.g., it can return either the expected type, or the parameter.

Haskell is elegant in that it compromises nothing for soundness, to
respect referential integrity and purity, but it still makes thing
convenient for the programmer using things such as monads


> the try/catch paradigm essentially says:
> 
> I wanted to call sub Dog foo() but there may be times when I
> discover, after making the call, that I really needed to call an anonymous
> sub { $inner::= sub Exception foo(); $e = $inner(); given $e {...} }.

Yes and no.

The try/catch mechanism is not like the haskell way, since it is
purposefully ad-hoc. It serves to fix a case by case basis of out
of bounds values. Haskell forbids out of bound values, but in most
programming languages we have them to make things simpler for the
maintenance programmer.

> We're conditionally editing the return stack. This fits right in with
> the earlier thread about conditionally removing code from the inside of
> loops, IMO. Once you open this can, you might as well eat more than one
> worm. Another conceptually similar notion is that of AUTOLOAD. As a perl
> coder, I don't EVER want to write
> 
>   say "Hello, world"
> or die "Write to stdout failed.";
> 
> -- it's "correct". It's "safe coding".  And it's stupid for a
> whole bunch of reasons, mostly involving the word "yucky".

It's incorrect because it's distracting and tedious.

http://c2.com/cgi/wiki?IntentionNotAlgorithm

Code which does it is, IMHO bad code because obviously the author
does not know where to draw the line and say this is good enough,
anything more would only make it worse.

> But I acknowledge that through the miracle of broken pipes, it can
> legitimately happen that stdout will fail while stderr is a viable
> diagnostic mechanism.

the default $SIG{PIPE} handler is a wonderful example of how nice
exception handling is for naive code.

$SIG{PIPE}'s only problem is that it's completely non standard.

> But the default behavior (modulo threads) is going to unlink all the
> stack frame pages when the continuation is invoked.

Forget the stack... Perl is CPS under the hood, even if it's
optimized not to be that way.

> So there has to be yet another copy of the links to the stack,
> because the exception handling will want to call functions and
> build who-knows-what elaborat

Re: Look-ahead arguments in for loops

2005-09-29 Thread Austin Hastings
Luke Palmer wrote:

>>On 9/29/05, Dave Whipp <[EMAIL PROTECTED]> wrote:
>  
>
   for grep {defined} @in -> $item, ?$next {
 print $item unless defined $next && $item eq $next;
   }


>>
>>
>
>>This is an interesting idea.  Perhaps "for" (and "map") shift the
>>minimum arity of the block from the given list and bind the maximum
>>arity.  Of course, the minimum arity has to be >= 1 lest an infinite
>>loop occur.  
>  
>

Or not. We've already seen idioms like

  for (;;) ...

If you specify your minimum arity as 0, then you're obviously planning to deal 
with it. This presumes that iterators can handle behind-the-scenes updating, of 
course.


>>But then perhaps you have another way to avoid integer
>>indices:
>>
>>for @list -> $this, [EMAIL PROTECTED] {
>>...
>>}
>>
>>As long as you don't look backwards.  Looking backwards makes problems
>>for GC in lazy contexts, so this might just be perfect.
>
Plus it's hard to talk about backwards. If you say

for @l -> ?$prev, $curr, ?$next {...}

what happens when you have two items in the list? I think we're best off using 
signature rules: optional stuff comes last.


=Austin






Re: Look-ahead arguments in for loops

2005-09-29 Thread Luke Palmer
On 9/29/05, Dave Whipp <[EMAIL PROTECTED]> wrote:
>for grep {defined} @in -> $item, ?$next {
>  print $item unless defined $next && $item eq $next;
>}

This is an interesting idea.  Perhaps "for" (and "map") shift the
minimum arity of the block from the given list and bind the maximum
arity.  Of course, the minimum arity has to be >= 1 lest an infinite
loop occur.  But then perhaps you have another way to avoid integer
indices:

for @list -> $this, [EMAIL PROTECTED] {
...
}

As long as you don't look backwards.  Looking backwards makes problems
for GC in lazy contexts, so this might just be perfect.

Luke


Re: Look-ahead arguments in for loops

2005-09-29 Thread Austin Hastings
Dave Whipp wrote:

> Imagine you're writing an implementation of the unix "uniq" function:
>
>my $prev;
>for grep {defined} @in -> $x {
>print $x unless defined $prev && $x eq $prev;
>$prev = $x;
>}
>
> This feels clumsy. $prev seems to get in the way of what I'm trying to
> say. Could we imbue optional binding with the semantics of not being
> consumed?
>
>   for grep {defined} @in -> $item, ?$next {
> print $item unless defined $next && $item eq $next;
>   }
>
> The same behavior, but without the variable outside the loop scope.
>
>
> It would also be good not to overload the meaning of $?next to also
> tell us if we're at the end of the loop. In addition to FIRST{} and
> LAST{} blocks, could we have some implicit lexicals:
>
>   for @in -> $item, ?$next {
> print $item if $?LAST || $item ne $next
>   }
>
I like the idea. There's no reason the view window and the consumption
have to be the same.

=Austin


Exceptuations, fatality, resumption, locality, and the with keyword; was Re: use fatal err fail

2005-09-29 Thread Austin Hastings
TSa wrote:

> HaloO,
>
> Yuval Kogman wrote:
>
>> On Wed, Sep 28, 2005 at 11:46:37 -0500, Adam D. Lopresto wrote:
>>
>>> The recent thread on Expectuations brought back to mind something
>>> I've been
>>> thinking for a while.  In short, I propose that "use fatal" be on by
>>> default, and
>>> that "err" be turned into syntactic sugar for a very small try/CATCH
>>> block.
>>
>>

You already know that "err" is the low-precedence version of //, right?
What replaces that? I like "default" or "defaults" myself, but I'm never
really sure what the precedence actually IS. After all, "and"/"or" were
lower than assignment, so you could code:

$a = foo or die;

and get ($a or die). How does this work for the "err"/"defaults"
keyword? Does the low-precedence version move up, or is there an idiom I
don't understand?

On the primary hand, I don't like the idea of using "err" as a try/catch
because that's putting exception handling in line with the primary code.
See FMTYEWT below.

>>
>> I like it a lot. It gives the advantages of both the flexible, more
>> robust try/catch, and the (locally) concise, clear error return.
>
>
> I don't like it at all. I fear, that we mix two orthogonal concepts
> just because it is convenient.
>
> To me the statement
>
>   return 42;  # 1
>
> has to orthogonal meanings:
>
>   1) the current scope has reached its (happy) end
>   2) a specific result was determined
>
> We can vary on both of these dimensions *independently*!
> Which gives the remaining three cases:
>
>   return undef; #  0   unspecific result
>   fail   undef; # -1   no return with unspecific reason
>   fail   42;# -2   no return but  determined reason
>
> In other words an exception means
>
>   return !caller;
>
> or in yet another way to describe my attitude: the least
> thing that *defines* an exception is that the dynamic
> scope in question has reached the conclusion that it
> is *not* going to give control back to its creator!


But it *does* give control, albeit briefly, back to its caller.

A million years ago, $Larry pointed out that when we were able to use
'is just a' classifications on P6 concepts, it indicated that we were
making good forward progress. In that vein, let me propose that:

* Exception handling, and the whole try/catch thing, IS JUST An awkward
implementation of (late! binding) run-time return-type MMD.

Specifically, if I promise you:

  sub foo() will return Dog;

and later on I actually wind up giving you:

  sub foo() will return Exception::Math::DivisionByZero;

the try/catch paradigm essentially says:

I wanted to call sub Dog foo() but there may be times when I
discover, after making the call, that I really needed to call an anonymous
sub { $inner::= sub Exception foo(); $e = $inner(); given $e {...} }.

We're conditionally editing the return stack. This fits right in with
the earlier thread about conditionally removing code from the inside of
loops, IMO. Once you open this can, you might as well eat more than one
worm. Another conceptually similar notion is that of AUTOLOAD. As a perl
coder, I don't EVER want to write

  say "Hello, world"
or die "Write to stdout failed.";

-- it's "correct". It's "safe coding". And it's stupid for a whole bunch
of reasons, mostly involving the word "yucky". But I acknowledge that
through the miracle of broken pipes, it can legitimately happen that
stdout will fail while stderr is a viable diagnostic mechanism.

Instead, I want PERL to fill that in for me: I believe that the default
error mechanism should debug my program, the shell script that calls my
program, and the actions (including blood alcohol content) of the user
of my program over the last 24 hours: lets leave use autodebug;
turned on by default.

The 'Exceptuation' proposal seems to me to include two things:

1. A 'RESUME' feature.
2. An implicit acknowledgement that the default implementations are
parallel:

{...
  CATCH  -> $e {throw $e;} # Going up?
  RESUME -> $r {resume $r;} # Going down?
}

The rest is optimization. If caller() includes an array of
continuations, then throw looks like a loop up the array:

  sub throw(Exception $e)
  {
reverse caller() ==> { .continuation($! => $e) if does(CATCH); }
  }

But the default behavior (modulo threads) is going to unlink all the
stack frame pages when the continuation is invoked. So there has to be
yet another copy of the links to the stack, because the exception
handling will want to call functions and build who-knows-what elaborate
skycastles. And it must be reentrant because of the possibility of
exceptions during the exception handling. Which means that the call
stack needs to be stored in the Exception. [The list of things in the
exception gets pretty long. I'm sure it's all a ref to the last page of
the call stack, so it doesn't gobble up much space, but there's a lot of
"and you'll want"s coming up.]

So resume is a multi, no? (Or it could just be a method:
$!.resume, but that doesn't read as well in a block that *really* sho

Look-ahead arguments in for loops

2005-09-29 Thread Dave Whipp

Imagine you're writing an implementation of the unix "uniq" function:

   my $prev;
   for grep {defined} @in -> $x {
   print $x unless defined $prev && $x eq $prev;
   $prev = $x;
   }

This feels clumsy. $prev seems to get in the way of what I'm trying to 
say. Could we imbue optional binding with the semantics of not being 
consumed?


  for grep {defined} @in -> $item, ?$next {
print $item unless defined $next && $item eq $next;
  }

The same behavior, but without the variable outside the loop scope.


It would also be good not to overload the meaning of $?next to also tell 
us if we're at the end of the loop. In addition to FIRST{} and LAST{} 
blocks, could we have some implicit lexicals:


  for @in -> $item, ?$next {
print $item if $?LAST || $item ne $next
  }


Re: skippable arguments in for loops

2005-09-29 Thread Dave Whipp

Luke Palmer wrote:


Joked?  Every other language that has pattern matching signatures that
I know of (that is, ML family and Prolog) uses _.  Why should we break
that?  IMO, it's immediately obvious what it means.

Something tells me that in signature unification, "undef" means "this
has to be undef", much like "1" means "this has to be 1".


In Perl6 we currently have at least tw oways to say "don't care": In a 
regex, we say /./ to match anything; in a type signature, we use "Any" 
to mean that we don't care what the type is. I don't think we need 
another way to say "don't care". In fact, we could unify things:


  rules: // matches anything (/./ is shorthand synonym)
  binding: ($a, Any, $b) := (1,2,3);

I'll admit that "Any" doesn't immediately shout "skip", but it would 
really be the fact that there's no variable associated with it that 
means "skip", If we'd wanted to skip an integer, we could say:


  ($a, Int, $b) := (1,2,3);

Why would Perl need to add "_" as a synonym for "Any"? It's only a 
couple of characters shorter! The argument for /./ being a synonym in 
rexen is easier to make: it's common, it's legacy, and it's 4 chars shorter.


Re: use fatal err fail

2005-09-29 Thread Carl Franks
On 29/09/05, Ingo Blechschmidt <[EMAIL PROTECTED]> wrote:

> * "try { foo() } err next" will next even if foo() did not throw
>   an exception, but returned undef. But I don't think that's a problem
>   in most cases. One can always do:
>   try { foo(); 1 }

I think that's a flag that it's not a great idea.

For the example given, I'd rather write
  my $fh = try {open $_; CATCH {next} };

and still fit it on 1 line!

For what it's worth, I'd like to chime in on 'yes please' for having
fatals on by default.
I've been hanging round some perl forums lately, and it's such a
basic, recurrent issue.

Cheers,
Carl


Re: use fatal err fail

2005-09-29 Thread Ingo Blechschmidt
Hi,

TSa wrote:
> Yuval Kogman wrote:
>> On Wed, Sep 28, 2005 at 11:46:37 -0500, Adam D. Lopresto wrote:
>>>thinking for a while.  In short, I propose that "use fatal" be on by
>>>default, and that "err" be turned into syntactic sugar for a very
>>>small try/CATCH block.
>> 
>> I like it a lot. It gives the advantages of both the flexible, more
>> robust try/catch, and the (locally) concise, clear error return.
> 
> I don't like it at all. I fear, that we mix two orthogonal concepts
> just because it is convenient.

I agree with you, TSa. I'd like to add that we don't have to do without
convenience in the majority of cases:

use fatal;

for @files {
my $fh = try { open $_ } err next;

load_config_from($fh);
}

* try {...} is, like Perl 5's eval {...}, *not* statement-level.
  This means you can easily wrap it around an expression.
  Particularly you can write
  my $fh = try { open $_ } err next;  # instead of

  my $fh;
  try {
  $fh = open $_;
  CATCH { next }
  };

* Yes, "try {...} err ..." does not check the exception type, but
  the proposed "... err ..." doesn't either.

* "try { foo() } err next" will next even if foo() did not throw
  an exception, but returned undef. But I don't think that's a problem
  in most cases. One can always do:
  try { foo(); 1 }


FWIW, I also agree with Darren that "use fatal" should be on by default.


--Ingo



Re: Exceptuations

2005-09-29 Thread Ruud H.G. van Tol
TSa schreef:

> Yes, I'm also all for unifying the concepts. But please
> don't let us call it exception. Exception should be a
> termination oriented (sub)concept. Some kind of scoped giving
> up. [...]
> In lack of a better word I use Event and we get
> Event::Exception, Event::Control, Event::Warn and
> possibly Event::Hint, Event::Log and Event::Fun :)
>
> The only drawback of choosing 'Event' might be that it
> smells too GUIish for some? Or is that a feature? That is
> we get Event::GUI::press, Event::GUI::scroll, Event::GUI::expose,
> etc.


FSM etc.
http://en.wikipedia.org/wiki/Event_driven_finite_state_machine

Running Perl code can be seen as an ATN (an FSM on steroids, says
http://smc.sourceforge.net/SmcFaq.htm).

An exception-handler can be allowed to pop more states than it is good
for.

-- 
Grtz, Ruud



Re: use fatal err fail

2005-09-29 Thread Yuval Kogman
On Thu, Sep 29, 2005 at 12:53:51 +0200, TSa wrote:
> I don't like it at all. I fear, that we mix two orthogonal concepts
> just because it is convenient.

"just because it is convenient" is precicely why I like it =)

> To me the statement
> 
>return 42;  # 1
> 
> has to orthogonal meanings:
> 
>1) the current scope has reached its (happy) end
>2) a specific result was determined

return literally means "give back". The caller is getting a value
that we give. This implies two completely non-orthogonal meanings to
me:

1) the scope has reached its happy end
2) it's reached the end because a specific result was determined

> We can vary on both of these dimensions *independently*!
> Which gives the remaining three cases:
> 
>return undef; #  0   unspecific result

just 'return' would do. But This is odd, unless the context is void
- if the caller is expecting something, wer're not returning an
"unspecific result" - we're returning a value. This value is in
bounds (it's a normal perl scalar) and it has a well known meaning
that "i have have nothing meaning to report".

I think this is actually a very concrete result.

>fail   undef; # -1   no return with unspecific reason
>fail   42;# -2   no return but  determined reason

Fail is, semantically:

(should_die ?? die !! return)

and the caller gets to determine the behavior.

Whether failures have an extras payload in a simple return
value, or whether the payload is carried via an out of bounds route
to the closest thing that can handle is really only dependant on how
the caller is most comfortable with handling errors.

> or in yet another way to describe my attitude: the least
> thing that *defines* an exception is that the dynamic
> scope in question has reached the conclusion that it
> is *not* going to give control back to its creator!

Not at all!

It's simply returning an out of bounds value to the closest caller
that is willing to handle out of bounds values.

In fact, it's short circuiting to it's caller, to give it control as
fast as possible since it doesn't know what to do anymore.

The reason exceptions tend to pop upwards more is that they are
handled in a way that if the immediate caller doesn't know how to
handle it either, it keeps going up the call stack till a calling
scope does know what to do, and can explcititly take control.

-- 
 ()  Yuval Kogman <[EMAIL PROTECTED]> 0xEBD27418  perl hacker &
 /\  kung foo master: /me beats up some cheese: neeyah!



pgpqFx7QmiXTK.pgp
Description: PGP signature


Re: use fatal err fail

2005-09-29 Thread TSa

HaloO,

Yuval Kogman wrote:

On Wed, Sep 28, 2005 at 11:46:37 -0500, Adam D. Lopresto wrote:


The recent thread on Expectuations brought back to mind something I've been
thinking for a while.  In short, I propose that "use fatal" be on by default, 
and
that "err" be turned into syntactic sugar for a very small try/CATCH block.



I like it a lot. It gives the advantages of both the flexible, more
robust try/catch, and the (locally) concise, clear error return.


I don't like it at all. I fear, that we mix two orthogonal concepts
just because it is convenient.

To me the statement

  return 42;  # 1

has to orthogonal meanings:

  1) the current scope has reached its (happy) end
  2) a specific result was determined

We can vary on both of these dimensions *independently*!
Which gives the remaining three cases:

  return undef; #  0   unspecific result
  fail   undef; # -1   no return with unspecific reason
  fail   42;# -2   no return but  determined reason

In other words an exception means

  return !caller;

or in yet another way to describe my attitude: the least
thing that *defines* an exception is that the dynamic
scope in question has reached the conclusion that it
is *not* going to give control back to its creator!

Note that this somewhat pinpoints or controls the two infinities
of computing in time and storage. One either needs a block of infinite
length right away or handle control flow exceptions *on the outside*
to keep a finite scope going.
--
$TSa.greeting := "HaloO"; # mind the echo!


Re: Exceptuations

2005-09-29 Thread Yuval Kogman
I'd like to ammend, and perhaps formalize with some definitions from
my dictionary, which ships with OSX:

error - a mistake... the state or condition of being wrong in
conduct or judgement... technical - a measure of the estimated
difference between the observed or calculated value of a
quantity and it's true value.

As i see it:

when something you wanted to happen turned out different than
you programmed it to:

my $handle = open "file";
# we assume $handle exists
print =<$handle>; # but what if there was an error?



exception - a person or thing that is excluded from a general
statement or does not follow a rule

To lessen the mental load on a programmer, instead of having the
programmer write a tree of all the conditions that could happen, the
programmer can write only the condition in which the program is
actually useful.

Any *error* (synch problems between the code and reality) causes an
*exception* in this linearization. The control flow is an exception
to the norm, because there was an exception in the reality the
program was tailored to deal with.

The reason we handle exceptions is that sometimes we want the tree
approach, because we have well defined behavior for certain paths.
Exceptions let us separate code from "normal" code and code which is
*exceptional*, and the reason it is exceptional is usually an error.



event - a thing that happens, especially one of importance

Every error is an event. Exceptions are one way to deal with events
we were not prepared for. But events can also be waited for (select
waits for events on many file handles at a time).

Every *error* is an *event*, but an *exception* is how you deal with
events. The events that cause exceptions by default in perl will be:

errors, when 'use fatal' is in effect

warnings, but to another handler

next, redo, last, return - all control flow events that are
exceptions to the single point of entry, single point of exit
school of thought.

I intentionally did not use the computer related definitions from
e.g. wikipedia, because they are more subject to cultural inertia,
and we are trying to discover the roots of these borrowed terms.

-- 
 ()  Yuval Kogman <[EMAIL PROTECTED]> 0xEBD27418  perl hacker &
 /\  kung foo master: /me groks YAML like the grasshopper: neeyah!!



pgpr89lYnXBsX.pgp
Description: PGP signature


Re: use fatal err fail

2005-09-29 Thread Darren Duncan

At 11:46 AM -0500 9/28/05, Adam D. Lopresto wrote:

The recent thread on Expectuations brought back to mind something I've been
thinking for a while.  In short, I propose that "use fatal" be on by default,


I totally, TOTALLY, agree with this.

EVERY built-in function and operator that talks to program-external 
resources should by default throw an exception on failure, including 
all system calls, file or filesystem operations, network operations, 
interprocess communications, signals, etc.


It is a lot easier to write safe, correctly functioning, and easy to 
debug programs when problems are detected as early as possible, which 
a default-active exception architecture ensures.


Naive developers will be helped greatly when they forget to account 
for possible problems, since errors don't crop up in a different 
place than their cause (eg, at 'print' time when the problem was with 
the 'open'); if they forget something, Perl will tell them.


Saavy developers who don't like the exceptions can explicitly turn 
them off, the very act of which implies that they know what they're 
doing and can handle the situations where Perl doesn't help them 
remember.


Considering that its a well known best practice to throw exceptions 
in one's own non-trivial programs and modules, it would be nice if 
the core language functions themselves were consistent with that 
practice.


Just as I agree that having 'use strict' turned on all the time 
and/or being the default, likewise having 'use fatal' turned on all 
the time and/or by default is also the best course of action.  While 
we're at it, 'use warnings' should probably be on by default too, but 
this is less important than 'fatal'.


-- Darren Duncan


Re: Exceptuations

2005-09-29 Thread Yuval Kogman
Hi!

On Thu, Sep 29, 2005 at 10:49:40 +0200, TSa wrote:
> BTW, I would call *intentional* exceptions terrorism.

Then I would call terrorism non linear control flow ;-)

In that case Afghanistan might be harboring computer scientists that
really like CPS, and bush is Java ;-)

> In lack of a better word I use Event and we get
> Event::Exception, Event::Control, Event::Warn and
> possibly Event::Hint, Event::Log and Event::Fun :)

An event is something external that happens... It does not affect
the control flow of an application.

Exceptions work well to describe this:

The normal flow is up and down the call graph, laying bread crumbs
in the form of a stack, and going back from where you came.

Exceptions let you jump instantly to another place in the call
graph. All I'm saying is that to complement the normal "exceptions
jump back out", you can jump out, and jump back in.

An event is a general thing that can be implemented with exception
like semantics, but implies nothing on the control flow of the
program.

An error is an exception that happenned because something went badly
wrong.


Now it's my turn at illustrative metaphors ;-)

The call graph is a big maze you go through.

When you find an *error*, in the form of a minotaur, you use the
exception handling mechanism to run away.

You jump instantly to a safe place in the labyrinth.

Although this is not consistent with the mythology, presume that the
reason you entered the maze was that you were trying to get results.

Most exception handlers are safe places when you can gather your
self, realize that 'oh crap, i just met a minotaur', and tell
whoever you sent you in there that there's no way you're going back
in.

All I'm trying to say is that when there is an exception - a leap
out from a dangerous place to a safe one, due to an error, the code
may choose to deal with the error by giving you a big stick. Then
you can go back and beat the minotaur into submission, and resume
with trying to get results.

-- 
 ()  Yuval Kogman <[EMAIL PROTECTED]> 0xEBD27418  perl hacker &
 /\  kung foo master: /me whallops greyface with a fnord: neeyah!!!



pgp9mjhsoAPUd.pgp
Description: PGP signature


Re: Exceptuations

2005-09-29 Thread TSa

HaloO,

Yuval Kogman wrote:

On Wed, Sep 28, 2005 at 09:49:11 -0700, Larry Wall wrote:

But thinking about optional continuations, another thing occured
to me.  It's always bugged me that warnings were something different
from exceptions, and now I think we can unify them, if we say that


Yes, I'm also all for unifying the concepts. But please
don't let us call it exception. Exception should be a
termination oriented (sub)concept. Some kind of scoped giving
up. E.g. a traffic accident is the exceptual case that
stops the regular traffic in a certain area. But for
medics, firemen and police they are the usual case up to
a limit where it also becomes exceptional to them.

Take the example of firemen. They are some kind of installed
exception handlers. And they can handle flooded basements
but New Orleans and Bavaria have thrown a too big exception.
Well, or take the engineers of the Titanic, they trusted their installed
exception handlers to cope with a breached hull so much that they
didn't install enough rescue boats.

BTW, I would call *intentional* exceptions terrorism.




a warning is simply an exception with two properties.
or have a WARN block of its own, I don't know.



Or maybe &*EXCEPTION_HANDLER is a multi-method-continuation.
...
An MMD exception handler that is extended in the dynamic scope is
cool because it's not limitied to just control exceptions, warnings,
and fatal errors.

Some fun definitions:


In lack of a better word I use Event and we get
Event::Exception, Event::Control, Event::Warn and
possibly Event::Hint, Event::Log and Event::Fun :)

The only drawback of choosing 'Event' might be that it
smells too GUIish for some? Or is that a feature? That is
we get Event::GUI::press, Event::GUI::scroll, Event::GUI::expose,
etc.
--
$TSa.greeting := "HaloO"; # mind the echo!