Re: Unifying invocant and topic naming syntax

2002-11-21 Thread Me
 [perhaps]
 : bare blocks (even those passed as args) just
 : pick up from the surrounding lexical context.

This is definitely a significant simplification.
Is it a problem?

 Yes, that's the problem. A bare block would
 have to notice at run time that it was called
 with unexpected arguments and unbind its
 binding to the outer $_.

That would be ughly, but I don't understand why
you say it must necessarily be so.


 : What does this mean:
 : 
 : $_ = 1; mumble - { $_ = 2 }; print;
 : 
 : perhaps the '-' could imply that $_ /is/
 : going to be private to the block somehow?
 
 As it stands now, explicitly telling it there
 are no arguments would have exactly the opposite
 effect, and bind $_ to the outer $_.

Oh.

I had the vague notion that (inline) bare blocks
don't do anything special beyond establishing
a nested lexical scope:

$_ = 1; { $_ = 2 }; print; # 2

whereas '-' means the topic gets set and is
private to the block (ignoring aliasing effects):

$_ = 1; for @foo - $_ { $_ = 2 }; print; # 1

It seems to me that a logical conclusion would be
that a blank arg list after a '-' would mean the
topic remains private (and is set to undef).

Perhaps having bare blocks work the same simple
way whether or not they appear as an arg, and
have - behave the same simple way whether or
not it is used with, say, a for, or as a sub
def, introduces problems or lost opportunities
elsewhere that nix the whole idea. But wait...


 I think Cmumble has to be able to wrap its own
 idea of $_ around the block at compile time somehow.

Perhaps.

But presumably you agree that it would be
nice if the calling syntax naturally made
it clear how $_ was being bound.

And documenting this by the '-' distinction
described above (ie - means private $_ set
by mumble, no - means $_ is just the outer
lexical) would look natural as well being
logical and strikingly simple.


 Perhaps we need to distinguish the type of
 a thunk from a sub in the signature of
 Cmumble.

This would not be necessary with the scenario
I describe above.


--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-21 Thread Larry Wall
On Thu, Nov 21, 2002 at 11:27:07AM -0600, Me wrote:
: And documenting this by the '-' distinction
: described above (ie - means private $_ set
: by mumble, no - means $_ is just the outer
: lexical) would look natural as well being
: logical and strikingly simple.

It would, however, force people to write:

grep - { /foo/ } @list;

I'd like to avoid that.  I think {...} can be somewhat context
sensitive.  It's certainly context sensitive in Perl 5, though
we'd like to get away from kludges like the $a/$b thing for sort.
But Perl 5 knows which blocks take a local $_ and which ones don't.
We aren't implementing it by temporizing a global in Perl 6, but we
could still presumably know which blocks work which way.

I think maybe the best way to think of it is to say that every block
always binds its first argument to $_, but there's enough mechanism to
make sure that the binding is to the outer $_ where that's expected,
such as for bare blocks and control structures that don't pass arguments
to their closures.  If that's known at compile time, it can be done
with ordinary lexical scoping of $_, but that's an implementation detail.

Larry



RE: Unifying invocant and topic naming syntax

2002-11-21 Thread Martin D Kealey
On Thu, 2002-11-21 at 20:11, Brent Dax wrote:
 Are you suggesting this?
 
   if($error) {
   use visible 'croak';
   require Carp;
   import Carp: 'croak';
   croak($error);
   }

No - that would be pointless as well as error-prone.

My idea of visible is that it would make a lexically scoped thing
accessible to an inner dynamic scope at run-time.

By default that would only apply to $_, but the mechanism should be
generalisable to any name.

-Martin



Re: Unifying invocant and topic naming syntax

2002-11-21 Thread Me
  Are you suggesting this?
  
  if($error) {
  use visible 'croak';
  require Carp;
  import Carp: 'croak';
  croak($error);
  }
 
 No - that would be pointless as well as error-prone.
 
 My idea of visible is that it would make a lexically scoped thing
 accessible to an inner dynamic scope at run-time.
 
 By default that would only apply to $_, but the mechanism should be
 generalisable to any name.

Yes. Regardless of the exact syntax, the idea
is presumably that the default way in which a
called sub can see/modify its caller's lexical
space is that it can see $_, can't see other
existing lexicals, and can add new lexicals.
Or something like that.

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-20 Thread Andy Wardley
Me wrote:
 Well, I could argue that c) already exists
 in the form of passing parameters in parens.

This reminds me of the Law of Demeter.  It specifies what your methods
should and shouldn't be able to do if you want to build a bright, shiny
system that never has bugs, maintains itself, turns water into wine, etc.

The essence is about limiting what you can access (and therefore screw up)
from a particular scope.  It's like a mild form of the no side effects 
policy of certain functional programming languages.  I'm not sure how 
applicable it's going to be to Perl 6, but here's the view from 30,000 feet.


Object Form of Law of Demeter
-

  Do not talk to strangers. 

  Within a method, messages can only be sent to the following objects:

  1. A parameter of the method, including the enclosing object (this or self);

 1.1. For pragmatic reasons: a global object;

  2. An immediate part object (computed or stored):

 2.1 An object that a method called on the enclosing object returns, 
 including attributes of the enclosing object;
 2.2 An element of a collection which is an attribute of the enclosing 
 object; 

  3. An object created within the method.


Usenet Form of Law of Demeter
-

  * You can play with yourself. 
  * You can play with your own toys (but you can't take them apart), 
  * You can play with toys that were given to you. 
  * You can play with toys you've made yourself.


Interested parties should Google[ law of demeter ] for the full story.

A




Re: Unifying invocant and topic naming syntax

2002-11-20 Thread Larry Wall
On Tue, Nov 19, 2002 at 03:09:40PM -0600, Allison Randal wrote:
: Larry wrote:
:  I'm trying to remember why it was that we didn't always make the first
:  argument of any sub the topic by default.  I think it had to do with
:  the assumption that a bare block should not work with a copy of $_ from
:  the outside.  
: 
: I dug through the archives. We were considering allowing dynamic scoping
: of $_ across subroutine calls (for backward compatibility with p5), so
: we delayed any final call on whether subs topicalize their first
: argument. We've pretty much resolved the first: such an abuse of lexical
: scope should be explicitly marked.
: 
: For consistency, I think the first argument of subs should be the topic by
: default.

This might work now, presuming

sub foo (;$_ = $=)

(or whatever) is really a binding, and not an assignment.  (That's another
reason why //= is *wrong*--it implies assignment.)

I guess it's almost an epistemological issue.  Suppose you see the
following general code:

$_ = 1;
mumble {
$_ = 2;
}
print $_;

How can you know whether it will print 1 or 2?  It will depend on
both the signature of Cmumble, and the signature of the bare closure
passed to it.  Things that are trying to look like Cgrep or Cmap
obviously want to have a private $_.  Things that are trying to look
like Cif or Cwhile will want to share $_ with the outside scope.

I suspect the bare block has to have a signature like (;$_ = $=) in the
absence of $^a etc.  That means that a bare block always treats $_ as
pseudo-dynamic (by aliasing two lexicals).  That means

$sub = {
$_ = 2;
};

$_ = 1;
$sub();
print $_;

would print 2.

But if the bare block always binds $_ inward, it's the wrapper that
actually decides the issue.  For something if-like:

sub mumble (block; $_ = $=) {
block();
}

For something grep-like:

sub mumble (block) {
block()
}

Oddly, if we make the first argument the topic by default, the second
block actually gets block as its topic.  That's...strange.  People will
expect it (rightly or wrongly) to be initialized with the outer value,
even if it's just a copy.  Hmm...need to think about this s'more...

Larry



RE: Unifying invocant and topic naming syntax

2002-11-20 Thread Martin D Kealey
On Wed, 2002-11-20 at 15:01, Brent Dax wrote:
 We need that capability if we're going to have lexically-scoped exports:

Whilst it would be useful for pragmatic modules to access anything and
everything in the current compilation scope, I submit that access to
dynamic scope should (in general) be more closely controlled... and of
course the former can be used to implement the latter:

  use visible '$topic';

  no visible '$_';

-Martin




Re: Unifying invocant and topic naming syntax

2002-11-20 Thread Austin Hastings

--- Larry Wall [EMAIL PROTECTED] wrote:
 ...

 This might work now, presuming
 
 sub foo (;$_ = $=)
 
 (or whatever) is really a binding, and not an assignment.  (That's
 another reason why //= is *wrong*--it implies assignment.)

Umm, that's what it was supposed to do.

IOW:  sub($param //= $=) 

means if you don't get one, grab the value of $=.

As opposed to sub($param ://= $=)

which would be a horrible-looking way of getting something by
reference.

Which is also why I asked about value/reference semantics.

Or is ; supposed to be the here be reference-args delimiter? (I
thought it meant here be named parameters...)


=Austin





Re: Unifying invocant and topic naming syntax

2002-11-20 Thread Luke Palmer
 Date: Wed, 20 Nov 2002 12:11:52 -0800 (PST)
 From: Austin Hastings [EMAIL PROTECTED]
 
 
 --- Larry Wall [EMAIL PROTECTED] wrote:
  ...
 
  This might work now, presuming
  
  sub foo (;$_ = $=)
  
  (or whatever) is really a binding, and not an assignment.  (That's
  another reason why //= is *wrong*--it implies assignment.)
 
 Umm, that's what it was supposed to do.
 
 IOW:  sub($param //= $=) 
 
 means if you don't get one, grab the value of $=.

More like if you don't get one, bind to $=

Copying stuff should always be explicit, as it can take awhile.  I'm
wondering how //= implies assignment while = doesn't.  But I tend to
like = better anyway.  And using := :

sub foo ($param := $=) {...}

Just feels wrong.  I guess there was no point to what I just wrote...

 As opposed to sub($param ://= $=)
 
 which would be a horrible-looking way of getting something by
 reference.

Using an operator that doesn't exist.

 Which is also why I asked about value/reference semantics.
 
 Or is ; supposed to be the here be reference-args delimiter? (I
 thought it meant here be named parameters...)

Neither.  It means here be optional parameters. Just like Perl 5.

Luke



Re: Unifying invocant and topic naming syntax

2002-11-20 Thread Me
 $_ = 1; mumble { $_ = 2 }; print;
 
 will print 1 or 2?

Least surprise, visually, is obviously 2.

This would be true if bare blocks (even
those passed as args) just pick up from
the surrounding lexical context. And if
that were true, mumble presumably could
not do anything about this (without some
as yet undefined language support).

What does this mean:

$_ = 1; mumble - { $_ = 2 }; print;

perhaps the '-' could imply that $_ /is/
going to be private to the block somehow?
Could mumble somehow be a continuation that
alternated between generating values to be
plugged in to the block and executing it?


 sub mumble (block) {
 block()
 }
 
 Oddly, if we make the first argument the
 topic by default, the second block actually
 gets block as its topic.  That's...strange.

This would go away with the above scenario.

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-20 Thread Larry Wall
On Wed, Nov 20, 2002 at 04:20:07PM -0600, Me wrote:
:  $_ = 1; mumble { $_ = 2 }; print;
:  
:  will print 1 or 2?
: 
: Least surprise, visually, is obviously 2.
: 
: This would be true if bare blocks (even
: those passed as args) just pick up from
: the surrounding lexical context. And if
: that were true, mumble presumably could
: not do anything about this (without some
: as yet undefined language support).

Yes, that's the problem.  A bare block would have to notice at run
time that it was called with unexpected arguments and unbind its
binding to the outer $_.  That's probably not gonna fly.

: What does this mean:
: 
: $_ = 1; mumble - { $_ = 2 }; print;
: 
: perhaps the '-' could imply that $_ /is/
: going to be private to the block somehow?

As it stands now, explicitly telling it there are no arguments would
have exactly the opposite effect, and bind $_ to the outer $_.

: Could mumble somehow be a continuation that
: alternated between generating values to be
: plugged in to the block and executing it?

Well, sure, doesn't need to be a continuation for that.  Doesn't
even need to be a coroutine unless you plan to get the values one
by one.

:  sub mumble (block) {
:  block()
:  }
:  
:  Oddly, if we make the first argument the
:  topic by default, the second block actually
:  gets block as its topic.  That's...strange.
: 
: This would go away with the above scenario.

True, but I think Cmumble has to be able to wrap its own idea of $_
around the block at compile time somehow.  Perhaps we need to distinguish
the type of a thunk from a sub in the signature of Cmumble.

sub mumble1 (Sub block) { block($curtopic) }
sub mumble2 (Block block) { block() }

Then

mumble1 { ... }

would compile to

mumble1 - $_ { ... }

while

mumble2 { ... }

would compile to

mumble2 - { ... }

forcing $_ to bind outward like a closure.

Possibly those are declared

sub mumble1 (block(Scalar)) { block($curtopic) }
sub mumble2 (block) { block() }

since code blocks are essentially typed by their signatures.

Larry



RE: Unifying invocant and topic naming syntax

2002-11-20 Thread Brent Dax
Martin D Kealey:
# On Wed, 2002-11-20 at 15:01, Brent Dax wrote:
#  We need that capability if we're going to have lexically-scoped 
#  exports:
# 
# Whilst it would be useful for pragmatic modules to access 
# anything and everything in the current compilation scope, I 
# submit that access to dynamic scope should (in general) be 
# more closely controlled... and of course the former can be 
# used to implement the latter:
# 
#   use visible '$topic';
# 
#   no visible '$_';

if($error) {
require Carp;
import Carp: 'croak';
croak($error);
}

Are you suggesting this?

if($error) {
use visible 'croak';
require Carp;
import Carp: 'croak';
croak($error);
}

That'll add up rather quickly, and further is dangerously easy to subtly
screw up.

--Brent Dax [EMAIL PROTECTED]
@roles=map {Parrot $_} qw(embedding regexen Configure)

If you want to propagate an outrageously evil idea, your conclusion
must be brazenly clear, but your proof unintelligible.
--Ayn Rand, explaining how today's philosophies came to be




Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Me
  don't understand when one could do the
  'is given($_)' and not do the ($_ = $_).
 
 Any time that the caller's topic isn't
 supposed to be explicitly passed as an
 argument, but is still used within the
 subroutine.

 [example]

 And, yes, I could make it an optional
 argument, but them I have no way of
 preserving my chosen interface. Or
 porting that code cleanly.

Well, it would mean the interface gets
the additional facet that the caller can
/optionally/ explicitly pass $_. I'd call
that a benefit, not a problem.

What's the issue with porting cleanly?


 Besides all that, ($_ = $_) where $_
 means something different from $_
 is Just Plain Wrong. ;-)

Well, I don't see it in quite that strong
a tone. One could argue that the context
of the rhs of assignments in the arg list
is /naturally/ the caller's. But I agree
it might cause a good ppl to double-take,
because of the way it looks.

More importantly, it doesn't seem LOUD
enough for what it's doing.

Unless it doesn't need to be loud because
one sorts out the issue of protecting
against potential problems by requiring
some explicit marking at the caller's end,
as I suggested in my recent Access to
caller's topic post.


--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Andy Wardley
Larry Wall wrote:
 So I was thinking it'd be better to use something different to
 represent the outer topic...

How about this:

   $_   # current topic
   $__  # outer topic
   $___ # outer outer topic

   ...etc...

I also wondered if $= might be a suitable alias to the current iterator.
It has a nice mnemonic, looking as it does like a '_' stacked on top 
of another.

   while $something {
   if ($=.first) {
   # first iteration
   }
   elsif ($=.last) {
   # last iteration
   }
   }

You could then use $==, $===, etc., to access outer iterators:

   while $foo {
   while $bar {
   if ($==.first) {
  # first foo
   }
   if ($=.first) {
  # first bar
   }
   }
   }


A




Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Tanton Gibbs
 How about this:

$_   # current topic
$__  # outer topic
$___ # outer outer topic


Unfortunately, or maybe fortunately, that is impossible to read correctly
without having to move the cursor and count how many underscores exist.

It seems to me, that in English, it is hard to correctly jump to a previous
topic without being fairly explicit.  If you start talking about trapeze
artists and I change the subject to monkees, then if I say I like the way
they swing, you should assume I am talking about monkees unless I have
explicitly changed the topic back to trapeeze artists.  I don't think there
should be a shortcut to do this, an explict way, yes, but not a shortcut as
it seems to break the English analogy.

Tanton




Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Dan Sugalski
At 6:56 AM -0500 11/19/02, Tanton Gibbs wrote:

  How about this:


$_   # current topic
$__  # outer topic
$___ # outer outer topic



Unfortunately, or maybe fortunately, that is impossible to read correctly
without having to move the cursor and count how many underscores exist.


More to the point, I think it's too much to have to juggle in your 
(or at least my) head at once. Sure the computer can do it, but 
that's not much use if I can't figure out what's being referred to.

It seems to me, that in English, it is hard to correctly jump to a previous
topic without being fairly explicit.


I expect this is due to inherent limitations in people. We can't keep 
too much stuff in flight at any one time in our heads, and stacking 
referents like this is not something we're well suited for.
--
Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Me
  $_   # current topic
  $__  # outer topic
  $___ # outer outer topic
 
 [not sufficiently visibly distinct]
 [too much anyway]

Agreed.

Returning to the topic of binding/copying
from a caller to a callee, what about using
square brackets to mark implicit args thus:

sub bar ($a, $b)
[$_, $foo]
{ ... }

In the above, implicit args go inside the
square brackets and the topic and $foo of
the sub being def'd are the same as (aliased
to) the topic and $foo of the calling sub.

As I said before, if you call a sub you
really ought to know that sub's signature,
and the above would make it clear that $_
and $foo are shared between caller and callee.

Of course, you might then come back and
change your calling code, accidentally
clobbering a shared lexical. So, back at
the caller end of things, I suggest the
following (simplified from an earlier post):

 o There's a property that controls whether
   called subs can share a given lexical of
   a callee. I'll call this property Yours.

 o By default, topics are set to Yours(rw);
   other lexicals are set to not Yours.

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Allison Randal
To summarize, we're discussing 3 features:

a) the ability to set the topic with a block (sub, method, etc)
b) the ability to set a default value for a parameter
c) the ability to break lexical scope
1) for $_ only
2) for any variable

Each of these features already have syntax that allows them to be used
independently:

  # a) set topic
  sub foo ($param is topic) { ... }
  # or it's set implicitly to the first parameter

  # b) default
  sub foo ($param = 5) { ... }

  # c) break lexical scope
  $CALLER::varname

The propsals all basically boil down to bits of syntactic sugar that
combine these three features in various ways. 

The fundamental question for each of the proposals is What's the
overall gain for the language in providing syntatic sugar for this
particular combination of features?

Allison



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Allison Randal
Larry wrote:
 I'm trying to remember why it was that we didn't always make the first
 argument of any sub the topic by default.  I think it had to do with
 the assumption that a bare block should not work with a copy of $_ from
 the outside.  

I dug through the archives. We were considering allowing dynamic scoping
of $_ across subroutine calls (for backward compatibility with p5), so
we delayed any final call on whether subs topicalize their first
argument. We've pretty much resolved the first: such an abuse of lexical
scope should be explicitly marked.

For consistency, I think the first argument of subs should be the topic by
default.

Allison



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Austin Hastings
So what's wrong with:

sub foo($param is topic //= $= // 5)# Shorter form with $=
sub foo($param is topic //= $CALLER::_ // 5) 

It doesn't really seem like we can make it much shorter. Yes, we could
convert //= into a single character, but why? People will understand
//=. 

The idea of $= as CALLER::_ is good, though.

Also, since we're jamming things into the signature, how do we declare
call-by-value/call-by-reference info?

=Austin


--- Allison Randal [EMAIL PROTECTED] wrote:
 To summarize, we're discussing 3 features:
 
 a) the ability to set the topic with a block (sub, method, etc)
 b) the ability to set a default value for a parameter
 c) the ability to break lexical scope
 1) for $_ only
 2) for any variable
 
 Each of these features already have syntax that allows them to be
 used
 independently:
 
   # a) set topic
   sub foo ($param is topic) { ... }
   # or it's set implicitly to the first parameter
 
   # b) default
   sub foo ($param = 5) { ... }
 
   # c) break lexical scope
   $CALLER::varname
 
 The propsals all basically boil down to bits of syntactic sugar that
 combine these three features in various ways. 
 
 The fundamental question for each of the proposals is What's the
 overall gain for the language in providing syntatic sugar for this
 particular combination of features?
 
 Allison




Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Austin Hastings

--- Allison Randal [EMAIL PROTECTED] wrote:
 Larry wrote:
  I'm trying to remember why it was that we didn't always make the
 first
  argument of any sub the topic by default.  I think it had to do
 with
  the assumption that a bare block should not work with a copy of $_
 from
  the outside.  
 
 I dug through the archives. We were considering allowing dynamic
 scoping
 of $_ across subroutine calls (for backward compatibility with p5),
 so
 we delayed any final call on whether subs topicalize their first
 argument. We've pretty much resolved the first: such an abuse of
 lexical
 scope should be explicitly marked.
 
 For consistency, I think the first argument of subs should be the
 topic by
 default.

For methods, will that be the invocant or the first other parameter?

$string.toLanguage(french)

Topic is $string, or french ?

=Austin



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Allison Randal
Austin wrote:
 
 For methods, will that be the invocant or the first other parameter?
 
 $string.toLanguage(french)
 
 Topic is $string, or french ?

It is the invocant.

Allison



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Allison Randal
On Tue, Nov 19, 2002 at 01:24:30PM -0800, Austin Hastings wrote:
 So what's wrong with:
 
 sub foo($param is topic //= $= // 5)# Shorter form with $=
 sub foo($param is topic //= $CALLER::_ // 5) 
 
 It doesn't really seem like we can make it much shorter. Yes, we could
 convert //= into a single character, but why? People will understand
 //=. 

There's not really anything wrong with it. But one of the tricks to an
elegant language is that it provides syntatic sugar for commonly used
features, instead of requiring you to type out long arcane sequences.
The problem is deciding which features deserve the sugar.

 The idea of $= as CALLER::_ is good, though.

Though C//= $= // is a nasty sequence. 

Allison



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Deborah Ariel Pickett
Ah . . . one message with two things I wanted to talk about.  Good.

Allison wrote:
 On Tue, Nov 19, 2002 at 01:24:30PM -0800, Austin Hastings wrote:
  So what's wrong with:
  
  sub foo($param is topic //= $= // 5)# Shorter form with $=
  sub foo($param is topic //= $CALLER::_ // 5) 
^^^
Don't I recall Larry saying that C //=  for setting a parameter's
default value was a Bad Idea, because it means that you can't explicitly
pass Cundef to foo()?  I thought it'd been changed to C =  for that
reason.

Or is this piece of code doing something different?

  It doesn't really seem like we can make it much shorter. Yes, we could
  convert //= into a single character, but why? People will understand
  //=. 
 
 There's not really anything wrong with it. But one of the tricks to an
 elegant language is that it provides syntatic sugar for commonly used
 features, instead of requiring you to type out long arcane sequences.
 The problem is deciding which features deserve the sugar.

(See my remark about three paragraphs down.)

  The idea of $= as CALLER::_ is good, though.

I'd like to raise my hand in the please, God, no! camp, for C $= .
One of the things about Perl 5 that I dislike the most is all the $( $
$- $= $[ $$ special variables.  Yes, we're losing almost all of them - I
think the only one that is really left is $! (*), which I can live with
- but if we're going to introduce more of these, then perhaps we're not
learning from our past mistakes as well as we think we are.

Yes, we've already been through the whole Cuse English; thing and how
no one uses it.  We don't need to talk about it again.  I'm just
expressing an opinion.  Move along, and tell me how these continuation
thingies work again.

Besides: inheriting a caller's topic isn't going to be that common a
thing that it needs such a short name, is it?

 Though C//= $= // is a nasty sequence. 

(*) $_ I don't consider special, because my C training leads me to think
of _ as an alphabetic character.  Probably not true in a Perl lexer, but
it's how my brain functions.

-- 
Debbie Pickett http://www.csse.monash.edu.au/~debbiep [EMAIL PROTECTED]
 I am the eye in the sky, looking at you, I can read your mind. I am the maker
of rules, dealing with fools, I can cheat you blind. And I don't need to see any
   more to know that I can read your mind. - _Eye in the Sky_, APP



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Austin Hastings

--- Allison Randal [EMAIL PROTECTED] wrote:
 On Tue, Nov 19, 2002 at 01:24:30PM -0800, Austin Hastings wrote:
  So what's wrong with:
  
  sub foo($param is topic //= $= // 5)# Shorter form with $=
  sub foo($param is topic //= $CALLER::_ // 5) 
  
  It doesn't really seem like we can make it much shorter. Yes, we
 could
  convert //= into a single character, but why? People will
 understand
  //=. 
 
 There's not really anything wrong with it. But one of the tricks to
 an
 elegant language is that it provides syntatic sugar for commonly used
 features, instead of requiring you to type out long arcane sequences.
 The problem is deciding which features deserve the sugar.
 
  The idea of $= as CALLER::_ is good, though.
 
 Though C//= $= // is a nasty sequence. 

Final // only required for another default:
 //= $= // 5   # Default to $CALLER::_, or 5
   



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Allison Randal
Austin wrote:
   The idea of $= as CALLER::_ is good, though.
  
  Though C//= $= // is a nasty sequence. 
 
 Final // only required for another default:
  //= $= // 5   # Default to $CALLER::_, or 5

Aye, it's just a worst case scenario. C//= $= and C= $= are still
line-noisy. It's a trade-off between clarity and brevity. 

Allison

-- 
Mene, mene, tekel



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Austin Hastings

--- Deborah Ariel Pickett [EMAIL PROTECTED] wrote:
 Ah . . . one message with two things I wanted to talk about.  Good.
 
 Allison wrote:
  On Tue, Nov 19, 2002 at 01:24:30PM -0800, Austin Hastings wrote:
   So what's wrong with:
   
   sub foo($param is topic //= $= // 5)# Shorter form with $=
   sub foo($param is topic //= $CALLER::_ // 5) 
 ^^^
 Don't I recall Larry saying that C //=  for setting a parameter's
 default value was a Bad Idea, because it means that you can't
 explicitly
 pass Cundef to foo()?  I thought it'd been changed to C =  for
 that
 reason.
 
 Or is this piece of code doing something different?

Maybe. This code says if $param is undef, pull the value from
$CALLER::_. If THAT is undef, it's 5.

So obviously this example doesn't WANT there to be an undef.

But if you wanted an undef and passed it, it wouldn't take it. 

So obviously we need ///=, the only if it REALLY wasn't there
operator. :-)

Or we could give special meaning to =.

Drat.

Good catch, though.

 
 (See my remark about three paragraphs down.)
 
 I'd like to raise my hand in the please, God, no! camp, for C $=
 .
 One of the things about Perl 5 that I dislike the most is all the $(
 $
 $- $= $[ $$ special variables.  Yes, we're losing almost all of them
 - I
 think the only one that is really left is $! (*), which I can live
 with
 - but if we're going to introduce more of these, then perhaps we're
 not
 learning from our past mistakes as well as we think we are.

Or maybe we're making a valid, justified decision that facilitating
this kind of thing is desirable. 

Remember, signatures are getting an AWFUL lot of information crammed
into them. In fact, I wonder if your question wouldn't be better asked
about all the information we're putting into them:  Do we actually know
enough about what we're doing to justify all this?

So far there are (modulo my having confused the line noise):

sub versive(
$invocant is topic: 
$arg is rw, 
@array is ro, 
*@flattened_rest; 
@optional_named_ones) 
is cached
{
print Don't let my rhyme \n
~   raise your hackles -- \n
~ Learn perl6 instead, \n
~   Cast off your shackles!\n\n;

print  - OR - \n\n;

print When your data base \n
~   is in a fix -- \n
~ Don't sweat the details, \n
~   Learn Perl 6! \n;
~ Burma Shave!\n;
}

And now we're trying to find out how to add one more item --
inherit-from-caller. 

It's really a neat idea, since it represents putting an entire idiom
into a single glyph -- essentially, surrounding every sub with 

if ($#_ == 0) { $_ := $CALLER::_; REST OF SUB }

Except that it's more than that, since you can do it for ANY part:

sub join($re, @*list = $=)   # Shouldn't that be @=? 

=Austin




Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Me
 c) the ability to break lexical scope

Well, I could argue that c) already exists
in the form of passing parameters in parens.

Of course, that doesn't feel like breaking
anything.

So instead I'll argue that the word break
is perhaps prejudicially perjorative.

I'd say, to steer away from being ppp:

c) introducing 'locals' or 'yours'

Where this terminology and perspective comes
from:

My view is that c) is about sharing vocabulary
between a caller and a callee to retain much
of the referential simplicity and brevity of
globals (and hence I think it's a pretty large
issue), and c) is also about the fact that this
can be done while omitting /all/ the dangers of
globals (short of dangers that also apply to
ordinary lexicals).

Elements of this shared vocabulary might be
called 'locals' or 'yours'.

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Me
 inheriting a caller's topic isn't going to be
 that common a thing that it needs such a short
 name, is it?

15% of the perl 5 builtins do so.

I have suggested that, in some extreme
scenarios such as short scripts, perhaps
as many as 50% of subs might do so. But
then again I probably ate a lot of cheese
just prior to suggesting that.

Damian has estimated that 5% of perl 6
code will do so. I've heard he can wolf
a lot of pizza.

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Mark J. Reed
On 2002-11-19 at 16:44:49, Me wrote:
 Elements of this shared vocabulary might be
 called 'locals' or 'yours'.
I like the 'yours' idea from the point of view of the callee:

my $inherited = your $_;

However, I also like the idea of having to mark shareable lexicals
explicitly in the caller, and the your keyword doesn't work as well
from the caller's point of view:

your $_;
somesub();  # this sub can see $_ 

It almost calls for our; too bad that's taken.  Although the current 
our has the exclusive we meaning (me and others but not you), and this
would be more of an inclusive we (me and you and maybe others); too bad
English only has the one set of pronouns for both. 

-- 
Mark REED| CNN Internet Technology
1 CNN Center Rm SW0831G  | [EMAIL PROTECTED]
Atlanta, GA 30348  USA   | +1 404 827 4754



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Me
  Elements of this shared vocabulary might be
  called 'locals' or 'yours'.

 I like the 'yours' idea from the point of
 view of the callee:
 
 my $inherited = your $_;

I like that syntax, but I'm uncomfortable
with an underlying principle, which is that
one can reach in to the caller's lexical
context from any place in a callee's body.
It exacerbates the (mostly over-stated, imo)
action-at-a-distance concerns about this.

I know you can do what you wrote anyway with
the $CALLER::foo syntax, but I don't like that
either.

Allison et al have already intimated that they
too find a generic 'yours' (or $CALLER::foo)
capability that can be fired off anywhere in
a sub's body to be dangerously obscure, to say
the least. So while they expect to provide the
raw $CALLER::foo capability, they have suggested
some sugar that's a lot prettier AND a lot less
dangerous for common cases (probably just for
dealing with $_, though I am currently thinking
it could work rather nicely to have it work for
any lexical).

Hence my focus on putting any callee side 'yours'
sugar in the sub preamble.


 However, I also like the idea of having to
 mark shareable lexicals explicitly in the
 caller, and the your keyword doesn't work
 as well from the caller's point of view:
 
 your $_;
 somesub();  # this sub can see $_ 
 
 It almost calls for our; too bad that's
 taken.

I was thinking of yours as in yours too,
and as in a property:

my $foo is yours;

$_ would be yours(rw) by default, all other
lexicals are not yours by default. The ability
to have yours(ro) and yours(rw) is part of why
I was thinking in terms of a property rather
than a, er, whatever Cmy is.

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Allison Randal
Me wrote:
  c) the ability to break lexical scope
 
 Well, I could argue that c) already exists
 in the form of passing parameters in parens.
 
 Of course, that doesn't feel like breaking
 anything.

Formal parameters are lexically scoped.

Lexical scope: references to the established entity can occur only
within certain program portions that are lexically contained within the
establishing construct. 

 So instead I'll argue that the word break
 is perhaps prejudicially perjorative.
 
 I'd say, to steer away from being ppp:
 
 c) introducing 'locals' or 'yours'
 
 Where this terminology and perspective comes
 from:
 
 My view is that c) is about sharing vocabulary
 between a caller and a callee to retain much
 of the referential simplicity and brevity of
 globals (and hence I think it's a pretty large
 issue), and c) is also about the fact that this
 can be done while omitting /all/ the dangers of
 globals (short of dangers that also apply to
 ordinary lexicals).
 
 Elements of this shared vocabulary might be
 called 'locals' or 'yours'.

It's a valid proposal. It's just not lexical scope.

I'm categorizing, not judging. This fits as a (c) feature.

Allison



RE: Unifying invocant and topic naming syntax

2002-11-19 Thread Brent Dax
Me:
#   Elements of this shared vocabulary might be
#   called 'locals' or 'yours'.
# 
#  I like the 'yours' idea from the point of
#  view of the callee:
#  
#  my $inherited = your $_;
# 
# I like that syntax, but I'm uncomfortable
# with an underlying principle, which is that
# one can reach in to the caller's lexical
# context from any place in a callee's body.
# It exacerbates the (mostly over-stated, imo) 
# action-at-a-distance concerns about this.
# 
# I know you can do what you wrote anyway with
# the $CALLER::foo syntax, but I don't like that
# either.

We need that capability if we're going to have lexically-scoped exports:

{
use FooBar 'baz';
baz();  #OK
}
baz();  #Unknown subroutine

Now, we can either include it in the Perl language or write it specially
for Exporter.  If we write it specially for Exporter, someone will
generalize the code and put it in a module (witness PadWalker.pm), so we
might as well have it in the base language and save someone some
hassles.

--Brent Dax [EMAIL PROTECTED]
@roles=map {Parrot $_} qw(embedding regexen Configure)

Wire telegraph is a kind of a very, very long cat. You pull his tail in
New York and his head is meowing in Los Angeles. And radio operates
exactly the same way. The only difference is that there is no cat.
--Albert Einstein (explaining radio)




Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Me
 # I'm uncomfortable [that]
 # one can reach in to the caller's lexical
 # context from any place in a callee's body.

 We need that capability if we're going to
 have lexically-scoped exports:

I think I was a bit careless in how I worded
that.

My problem is not that one reaches in to the
caller's lexical context, but where one gets
to declare that that is going to happen.

I am thinking one should have to predeclare
in a sub's preamble that such a trick will
be going on.

Thus something like:

sub foo [bar] { ... }

is (part of what is) required to be allowed
to create a bar sub in the context of the
caller of foo.

--
ralph



RE: Unifying invocant and topic naming syntax

2002-11-19 Thread Brent Dax
Me:
# I am thinking one should have to predeclare
# in a sub's preamble that such a trick will
# be going on.
# 
# Thus something like:
# 
# sub foo [bar] { ... }
# 
# is (part of what is) required to be allowed
# to create a bar sub in the context of the
# caller of foo.

So how does Exporter declare its import() function?

--Brent Dax [EMAIL PROTECTED]
@roles=map {Parrot $_} qw(embedding regexen Configure)

Wire telegraph is a kind of a very, very long cat. You pull his tail in
New York and his head is meowing in Los Angeles. And radio operates
exactly the same way. The only difference is that there is no cat.
--Albert Einstein (explaining radio)




Re: Unifying invocant and topic naming syntax

2002-11-19 Thread Me
 # I am thinking one should have to predeclare
 # in a sub's preamble that such a trick will
 # be going on.
 #
 # Thus something like:
 # 
 # sub foo [bar] { ... }
 # 
 # is (part of what is) required to be allowed
 # to create a bar sub in the context of the
 # caller of foo.
 
 So how does Exporter declare its import() function?

Keeping things simple, something like:

method import [*] { ... }

is required if one is to use $CALLERS::
in the body.

Skip the rest unless you enjoy flights
of pure fancy.

=

Being really radical, perhaps [*] means
that all the lexicals in the caller are
mapped to an identical set of lexicals
in the called. Dangerous stuff, huh?

Entering the realms of the truly insane,
one could have something like:

method import (@symbols)
  [ { @symbols } ]
{ ... }

to indicate run time eval of the locals
list, but the above ignores all sorts
of practical problems and is plainly
huge overkill for the situation.

(All of this would of course still be
subject to the Yours property that by
default restricts localization to the
topic, and to non-existent lexicals,
ones the called sub intends to /add/
to the caller's lexical context.)

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-18 Thread Larry Wall
On Mon, Nov 18, 2002 at 08:05:47AM +1100, Damian Conway wrote:
: I still think my original:
: 
:   sub bar(; $foo = $topic) is given($topic) {...}
: 
: is the appropriate compromise.

Won't fly.  Referring to something lexical before it's declared is
a no-no.  I think we need some other way of indicating the outer topic
if we're gonna use it as a default, and I think we do want that.

Perhaps it's a good time for a real keyword for use in defaults:

sub bar(; $foo = topic) {...}

That would let us work it nicely for arrays too:

sub bar(*@args = [topic]) {...}

Without the [], people might get confused about what to do with a $_
containing an array reference.  But maybe that means it should really
be a magical variable so we can distinguish

sub bar(*@args = $mumble) {...}   # default to [$_]
sub bar(*@args = @$mumble) {...}  # default to @$_

What mumble might be is an interesting, er, topic.

Larry



Re: Unifying invocant and topic naming syntax

2002-11-18 Thread Damian Conway
Larry Wall wrote:


On Mon, Nov 18, 2002 at 08:05:47AM +1100, Damian Conway wrote:
: I still think my original:
: 
: 	sub bar(; $foo = $topic) is given($topic) {...}
: 
: is the appropriate compromise.

Won't fly.  Referring to something lexical before it's declared is
a no-no.  

I would maintain that that depends on the associativity of Cis given. ;-)
But you mean in a strict left-to-right parsing sense.



I think we need some other way of indicating the outer topic
if we're gonna use it as a default, and I think we do want that.


I think so too.



Perhaps it's a good time for a real keyword for use in defaults:

sub bar(; $foo = topic) {...}


That would have to be:

	sub bar(; $foo = topic) is given($whatever) {...}

wouldn't it? Otherwise the topic is Cundef.


Anyway, I think a Ctopic keyword is NQR.
For a start, it introduces a (rather too) subtle difference between:

	sub bar($foo = topic) is given($whatever) {...}

and:

	sub bar($foo is topic) is given($whatever) {...}

not to mention the pain in continually needing to explain why this is okay:

	sub bar($foo is topic = topic) is given($whatever) {...}

but this is not:

	sub bar($foo = topic is topic) is given($whatever) {...}


Hm. Given that the topic is in some sense a property of the lexical
scope of the subroutine body, this might be a possibility:

	sub bar($foo is MY.topic) is given($whatever) {...}

But I think there's a better solution. See below.



That would let us work it nicely for arrays too:

sub bar(*@args = [topic]) {...}

Without the [], people might get confused about what to do with a $_
containing an array reference.  But maybe that means it should really
be a magical variable


Yep.



so we can distinguish

sub bar(*@args = $mumble) {...}	# default to [$_]
sub bar(*@args = @$mumble) {...}	# default to @$_

What mumble might be is an interesting, er, topic.


I would argue it ought to be just $_, which is, after all,
the One True Topic. And conveniently lexically predeclared in all scopes.

I would also argue that it ought not be called anything else.
Surely don't want two specially named variables for the topic?

Damian




RE: Unifying invocant and topic naming syntax

2002-11-18 Thread Brent Dax
Damian Conway:
# Larry Wall wrote:
#  On Mon, Nov 18, 2002 at 08:05:47AM +1100, Damian Conway wrote:
#  : I still think my original:
#  : 
#  :   sub bar(; $foo = $topic) is given($topic) {...}
#  :
#  : is the appropriate compromise.
#  
#  Won't fly.  Referring to something lexical before it's 
# declared is a 
#  no-no.
#  sub bar(*@args = $mumble) {...}   # default to [$_]
#  sub bar(*@args = @$mumble) {...}  # default to @$_
#  
#  What mumble might be is an interesting, er, topic.
# 
# I would argue it ought to be just $_, which is, after all,
# the One True Topic. And conveniently lexically predeclared in 
# all scopes.

I prefer $CALLER::_ (CALLER:: - access caller's lexical variables, then
globals).  I'd expect that you could use the same thing for other
variables, e.g. $CALLER::some_lexical.  Of course, the can of worms that
opens is horrifying to consider (and no longer has the benefit of the
ugly caller.MY).  :^)

--Brent Dax [EMAIL PROTECTED]
@roles=map {Parrot $_} qw(embedding regexen Configure)

Wire telegraph is a kind of a very, very long cat. You pull his tail in
New York and his head is meowing in Los Angeles. And radio operates
exactly the same way. The only difference is that there is no cat.
--Albert Einstein (explaining radio)




Re: Unifying invocant and topic naming syntax

2002-11-18 Thread Me
Larry:
  sub bar(; $foo = topicmumble) {...}
Damian:
 topic [would be] Cundef.

I assumed topicmumble implied an 'is given'.
I don't see why it couldn't.


Damian:
 Hm. Given that the topic is in some sense
 a property of the lexical scope of the subroutine
 body, this might be a possibility:

 sub bar($foo is MY.topic) is given($whatever) {...}

Isn't this confusing dynamic and lexical scopes?
Perhaps:

sub bar (;$foo = YOUR.topic) { ... }
sub bar (;$foo = CALLERS.topic) { ... }


  sub bar(*@args = $mumble) {...} # default to [$_]
 
  What mumble might be is an interesting, er, topic.
 
Damian:
 I would argue it ought to be just $_

You seem to be saying one could write:

sub bar (;$foo = $_) { ... }

Btw, can one write any/all of these and
have DWIMery:

sub bar (;$_) { ... }
bar ( _ = 1 );
sub bar (;$_ = $_) { ... }

As other's have suggested, a mumble of
$CALLERS::_ makes sense:

sub bar (;$foo = $CALLERS::_) { ... }

but I can see the point of a different
syntax dedicated to just the upscope topic
to avoid encouraging wider use of $CALLERS.

Hmmm.

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-18 Thread Larry Wall
On Tue, Nov 19, 2002 at 07:45:25AM +1100, Damian Conway wrote:
: What mumble might be is an interesting, er, topic.
: 
: I would argue it ought to be just $_, which is, after all,
: the One True Topic. And conveniently lexically predeclared in all scopes.
: 
: I would also argue that it ought not be called anything else.
: Surely don't want two specially named variables for the topic?

I actually had an entire ramble on that subject that I deleted from
my previous message before I wrote what I wrote.  But the gist of
it was similar, in that $_ is of indeterminate meaning in a signature
anyway, so why not force it to mean what we want it to mean?  The
long and the short of it was that

my sub foo ($_ := $arg = $_)

is how you might set $arg to be both the topic and the given.
In the common case, that comes down to

my sub foo ($_ = $_)

to just propagate the outer $_ inward.  But it still has the problem that
it looks like a declaration of $_ followed by a use of $_ that *isn't* that
declaration.  So I was thinking it'd be better to use something different to
represent the outer topic, like:

my sub foo ($_ = $^)
my sub foo ($_ = $+)
my sub foo ($_ = $|)
my sub foo ($_ = $=)
my sub foo ($_ = $:)
my sub foo ($_ = $?)
my sub foo ($_ = $$)
my sub foo ($_ = $@)

or some such.  That's what I meant by mumble.  I kinda like $= at the
moment, presuming it's coming available from formats.  Or maybe $?.

Possibly we have something more evil than that, such as the notion that
$? is a double sigil that pulls a name out of the dynamic context's
lexical scope.  Then we could write $?_ for the outer $_, $?foo for the
outer $foo, @+_ for the outer @_, $?! for the outer $!, etc.  That would
make it

my sub foo ($arg is topic = $?_)

I suppose it could be argued that defaulting the outer topic should also
set the inner topic by default, so you could write

my sub foo ($arg = $?_) {
when 1 { ... }
...
}   

I'm trying to remember why it was that we didn't always make the first
argument of any sub the topic by default.  I think it had to do with
the assumption that a bare block should not work with a copy of $_ from
the outside.  But if the signature for a bare block is ($_ = $?_), and
if the = there is really a binding operator, then the inner $_ is just
an alias for the outer one, and it doesn't really matter in that case.

I'm not sure whether we should allow $?_ in a sub body, however.

for @sortparms {
closure := { $?_
   j  ?? $^a = $^b
  :: $^b = $^a
};
sort closure, @list;
}

In this case, $?_ would be synonymous with $OUTER::_, since the block is
called in the same lexical context.  But that wouldn't necessarily always
be the case.  We can assume the outer dynamic scope also has a $_ in its
lexical scope, but assuming there's a $?foo out there is more problematic.

But maybe that's one way to explicitly export symbols:

module Foo;
?foo := my_foo;

That assumes we can tell the the outer scope is being compiled
currently.  It would have the same restrictions as mucking around
with caller.MY, basically.

But don't worry, I still think normal export should be via properties
on the declaration of sub my_foo.

Larry



Re: Unifying invocant and topic naming syntax

2002-11-18 Thread Damian Conway
Larry wrote:


The long and the short of it was that

my sub foo ($_ := $arg = $_)

is how you might set $arg to be both the topic and the given.


Wow. I'm surprised by how much I don't like that syntax! ;-)

I mean, two entirely different meanings for $_ in the space of one parameter
definition? And both := and = in one parameter definition?

I'd *so* much prefer to have to write:

  my sub foo ($arg is topic = $CALLER::_)

(see below).



In the common case, that comes down to

my sub foo ($_ = $_)

to just propagate the outer $_ inward.


That only works when $_ can somehow be shoe-horned into the parameter list.
Whereas:

  my sub foo is given($_)

works for *any* parameter list.



So I was thinking it'd be better to use something different to
represent the outer topic, like:

my sub foo ($_ = $^)
my sub foo ($_ = $+)
my sub foo ($_ = $|)
my sub foo ($_ = $=)
my sub foo ($_ = $:)
my sub foo ($_ = $?)
my sub foo ($_ = $$)
my sub foo ($_ = $@)

or some such.  That's what I meant by mumble.  I kinda like $= at the
moment, presuming it's coming available from formats.  Or maybe $?.


$= as an alias for the caller's $_, I could certainly live with.
It's mnemonically *much* better than $?. And it gets rid of the need
for a separate Cis given property on the subroutine, since the sub
can just refer to $= if it needs to.

And no, formats aren't going to need $=.



Possibly we have something more evil than that, such as the notion that
$? is a double sigil that pulls a name out of the dynamic context's
lexical scope.  Then we could write $?_ for the outer $_, $?foo for the
outer $foo, @+_ for the outer @_,


Typo on that last one (I hope!)



$?! for the outer $!, etc.  That would
make it

my sub foo ($arg is topic = $?_)


The only problems I have with this are:

	1. Do we really want to allow every lexical to be accessible anywhere
	   in its dynamic scope? This has many of the same drawbacks as Clocal.
	   $_ is probably a special case (which argues for $= rather than
	   a general mechanism).

	2. If we *do* want to provide that mechanism, do we really want to make
	   it that easy/subtle/short/missable? If we're going to do this,
	   I think $CALLER::_, $CALLER::foo, @CALLER::_, $CALLER::! might be
	   better. At least they're ugly, and scream for special attention. ;-)



I suppose it could be argued that defaulting the outer topic should also
set the inner topic by default, so you could write

my sub foo ($arg = $?_) {
	when 1 { ... }
	...
}	


Yeah, I wouldn't have a problem with that
(except for $?_ not being $CALLER::_ ;-)

Though I think:

	my sub foo($arg = $=) {...}

would be even better.

Damian





Re: Unifying invocant and topic naming syntax

2002-11-18 Thread Me
  my sub foo ($_ = $_)
  
  to just propagate the outer $_ inward.
 
 That only works when $_ can somehow be
 shoe-horned into the parameter list.
 Whereas:
 
my sub foo is given($_)
 
 works for *any* parameter list.

Other than the placeholder situation, I
don't understand when one could do the
'is given($_)' and not do the ($_ = $_).


  Possibly we have something more evil than
  that, such as the notion that $? is a double
  sigil that pulls a name out of the dynamic
  context's lexical scope.
 
 1. Do we really want to allow every lexical to
be accessible anywhere in its dynamic scope?

It is intriguing.

One only needs to know the def of a sub one is
calling. One does not have to worry about subs
that get called by the sub one is calling. Imo
one should know the def of a sub one calls. In
this case one needs to know the pertinent arg
/names/, not just their position, but that is
already somewhat the case for optional args.

When writing in the, er, medium (as against
small or large), one could develop a variable
name vocabulary, rather as one does with
globals, but without its dangers:

A (horrible, but hopefully illustrative)
example:

my $filename = 'foobar';
my $buf;
open;
read;
write;
delete;

I'm imagining a potential sweetspot between
globals and lexicals. An extension of the
power of it, which is just a way to talk
more succinctly when you can get away with
assumptions about nearby nouns. No?


 2. If we *do* want to provide that mechanism,
do we really want to make it that easy/subtle

If the sweetspot I theorize above exists,
then I think my answer is 'yes' to easy.

But, no matter what, NO to subtle. It would
be important that people know that any given
arg is, er, given, or one just ends up with
something that is halfway to the usual global
problem.

I'm thinking the syntax should be, in order
of priority, LOUD, short, pleasing.

I'm also thinking it would be nice to be able
to say that the called sub's lexical shares its
name as well as value (copy or bound) with the
calling sub's lexical, without having to say
the name twice. Further, that this would be a
good pick as the norm, with the syntax optimized
for that, so that it may be more cumbersome when
you want the formal and actual arg names to be
different.

Perhaps we need some Unicode? ;


--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-18 Thread Damian Conway
ralph wrote:


Other than the placeholder situation, I
don't understand when one could do the
'is given($_)' and not do the ($_ = $_).


Any time that the caller's topic isn't supposed to be
explicitly passed as an argument, but is still used within
the subroutine.

For example, the Class::Contract module provides a subroutine
like this:

	# Perl 5 code
	
	sub check(\%;$) {
		my $state = !$#_ ? 0 : $_[1] ? 0 : 1;
		my $forclass = $_;
		defined $forclass or croak;

		$_[0]-{$forclass} =
		   	bless { prev=$no_opt{$forclass}, forclass=$forclass},
			  'Class::Contract::FormerState';
		$no_opt{$forclass} = $state;
	}

It is passed a hash (that is used to store objects it generates) and a scalar
that indicates whether checking is to be enabled or disabled. It uses the
callers $_ (which is specifically *not* passed as an argument) to determine
what class to turn checking on or off for. That (slightly odd) interface
allows users of the module to write very tidy code:

	check %cache, $on_or_off
		for qw/Class1 Class2 Class3/;

Ccheck needs the callers $_, but doesn't (want to) have it passed as an
argument. So a ($_ = $_) argument won't work.

And, yes, I could make it an optional argument, but them I have no way of
preserving my chosen interface. Or porting that code cleanly.

Besides all that, ($_ = $_) where $_ means something different from $_
is Just Plain Wrong. ;-)


Damian




Re: Unifying invocant and topic naming syntax

2002-11-17 Thread Damian Conway
Adam D. Lopresto wrote:


It seems like that would be useful and common enough to write as

  sub bar(;$foo is given) {
  ...
  }

Where $foo would then take on the caller's topic unless it was explicitly
passed an argument.


While I can certainly see the utility of that, I believe it is too confusing
to have all three of:

	* Cis topic on parameters
	* Cis given on parameters
	* Cis given on subroutines

withthe two Cis givens meaning quiet different things.

In addition, I think saying C$param is given doesn't convey what is actually
happening there (i.e. that $param only *defaults* to the caller's topic).

Finally, I would rather we did not have more than one syntax for specifying
default values for parameters.

I still think my original:

	sub bar(; $foo = $topic) is given($topic) {...}

is the appropriate compromise.

Damian
	




Re: Unifying invocant and topic naming syntax

2002-11-17 Thread Adam D. Lopresto
  My favorite was from ages ago:
  
  sub bar(;$foo //= $_) {...}
 
 I think that today that would be written more like this:
 
   sub bar(;$foo) is given($def_foo) {
   $foo = $def_foo unless exists $foo;
   ...
   }
 
 Though we might get away with:
 
   sub bar(;$foo = $def_foo) is given($def_foo) {
   ...
   }

It seems like that would be useful and common enough to write as

  sub bar(;$foo is given) {
  ...
  }

Where $foo would then take on the caller's topic unless it was explicitly
passed an argument.
-- 
Adam Lopresto ([EMAIL PROTECTED])
http://cec.wustl.edu/~adam/

Never be afraid to tell the world who you are.

--Anonymous



Re: Unifying invocant and topic naming syntax

2002-11-16 Thread Damian Conway
Luke Palmer wrote:


My favorite was from ages ago:

sub bar(;$foo //= $_) {...}


I think that today that would be written more like this:

	sub bar(;$foo) is given($def_foo) {
		$foo = $def_foo unless exists $foo;
		...
	}

Though we might get away with:

	sub bar(;$foo = $def_foo) is given($def_foo) {
		...
	}


	


Or, if you stick with Perl5 convention, and I imagine this is what
people will expect from the builtins at least:

sub bar($foo; $baz) is given($baz) {...}


I think this should definitely be a compile-time error.

Damian




Re: Unifying invocant and topic naming syntax

2002-11-16 Thread Damian Conway
Andrew Wilson wrote:


It's the difference between this:

print;

and this:

print $_;

It is as far as I'm concerned exactly what topic is all about. 

Exactly.



It let's you write subroutines that behave like builtins with respect 
 to $_.  I think it's generally intended to be used like so:


sub my_print is given($default) {
  my @args = @_ // $default;
  ...
}

i.e. only doing stuff with $_ if no explicit parameters are passed.


I would expect that to be by far the most common use of Cis given.



I don't think that'll be a massive problem with this.  It's not the same
thing at all because $_ is now lexical it's not passed to stuff you call
unless it specifically asks for it.  This will eliminate the trampling
over $_ several levels down.  Needlessly messing with caller's $_ will
become like not using strict or warnings.  Occasionally useful but
generally frowned on in a don't do that kind of way.


My sentiments precisely. Though it may only be frowned upon in a
don't do that without documenting it kind of way. ;-)

Damian




Re: Unifying invocant and topic naming syntax

2002-11-16 Thread Damian Conway
Acadi asked:

 Just ( my ) terminology clean-up : in this example sub{ } is implicit
 topicalizer

No. It isn't a topicalizer at all.

 ( it does not set $_ explicitly )

Or implicitly.


 and you are setting $_ for perl .

Yes.

 that's why you can use when .

Yes.




is this valid ? 
(morning() is function that analyse stringifyed time ) 

#!/usr/bin/perl -w 

when ~time ~~ morning { print good morning }

Yep. If Cwhen is given a boolean, it acts like an Cif
(except for the automatic Cbreak at the end of its block.





and also 
 

#!/usr/bin/perl -w 
$_ = ~time
when morning() { print good morning }

Almost. You want:

  when morning { print good morning }

(i.e. no explicit call parens)

Damian




Re: Unifying invocant and topic naming syntax

2002-11-15 Thread fearcadi
Damian Conway writes:
  Micholas Clarke asked:
  
   If a subroutine explicitly needs access to its invocant's topic, what is so
   wrong with having an explicit read-write parameter in the argument list that
   the caller of the subroutine is expected to put $_ in?
  
  Absolutely nothing. And perfectly legal. You can even call that rw parameter $_
  if you like:
  
   sub get($id_obj, $_ is rw) {
   when who { return $id_obj.name }
   when choose  { return any($id_obj.features).pick }
   when all { return $id_obj.features }
   }
  
   for «name choose all» {
   print get($obj, $_);
   }
  

Just ( my ) terminology clean-up : in this example sub{ } is implicit
topicalizer ( it does not set $_ explicitly ) , and you are setting $_ 
for perl . that's why you can use when . 


???

is this valid ? 
(morning() is function that analyse stringifyed time ) 

#!/usr/bin/perl -w 

when ~time ~~ morning { print good morning }

__END__

and also 
 

#!/usr/bin/perl -w 
$_ = ~time
when morning() { print good morning }

__END__


arcadi .



Re: Unifying invocant and topic naming syntax

2002-11-14 Thread Damian Conway
Micholas Clarke asked:


If a subroutine explicitly needs access to its invocant's topic, what is so
wrong with having an explicit read-write parameter in the argument list that
the caller of the subroutine is expected to put $_ in?


Absolutely nothing. And perfectly legal. You can even call that rw parameter $_
if you like:

	sub get($id_obj, $_ is rw) {
	when who { return $id_obj.name }
	when choose  { return any($id_obj.features).pick }
	when all { return $id_obj.features }
	}

	for «name choose all» {
	print get($obj, $_);
	}



If I understand all this correctly, as is, this access caller's topic
is an unrestricted licence to commit action at a distance.


Yes. As in Perl 5.



Accessing the caller's topic is the default in perl5. And there is still a
steady stream of bugs to p5p where core perl modules are doing something
(typically a while loop) which tramples on $_, and so makes something go
wrong in their caller. (possibly several levels down)


Yes. That's why it's not the default in Perl 6, and you have to specify
a verbose and slightly ungainly property in order to get the behaviour.



Damian




Re: Unifying invocant and topic naming syntax

2002-11-13 Thread Larry Wall
On Mon, Nov 11, 2002 at 11:48:06PM -0600, Me wrote:
: Are placeholders only usable with anonymous
: subs, or named subs too?

Placeholders are not intended for use with named subs, since named
subs have a way of naming their parameters in a more readable fashion.
However, it may well fall out that if you say

sub foo { $^b = $^a }

it would effectively mean the same thing as

sub foo ($a, $b) { $b = $a }

But note that there's no placeholder equivalent for a forward declaration:

sub foo ($a, $b) { ... }

: Switching briefly to currying, can one curry
: a method?

Hmm.  We can allow what makes sense.  I suppose a class should be
allowed to curry one of its own methods on any non-invocant parameter,
since that's just equivalent to defining a new method in the same class.
(Generally, outside of a class, if you want to make the signatures of
the methods look different, the standard way is to derive a new class.)

Currying on the invocant is different, since it essentially turns
a method into a subroutine, and treats a class as a mere module.
This could be construed as antisocial.  However, as a special case,
one might often want to curry a set of methods to assume a particular
invocant.  But the syntax for that should probably involve the class
rather than the individual methods.  Saying

use DB_Connection.assuming(self = new DB_Connection)

could import all of DB_Connection's public methods into the current
class or module as subroutines, and then you don't have to do the
sort of I'm-a-class-no-I'm-a-module shenanigans that modules like
CGI currently do.

Larry



Re: Unifying invocant and topic naming syntax

2002-11-13 Thread Nicholas Clark
Apologies for raising the dead (horse)

On Thu, Nov 07, 2002 at 03:27:51PM -0600, Me wrote:
 Damian:
  [it will be passed to about 5% of subs,
   regardless of whether the context is your
   10 line scripts or my large modules]
 
 If the syntax for passing it to a sub
 remains as verbose as it currently is,
 you are probably right that it won't
 be used to achieve brevity! I think it's
 a pity given that the core point of it
 is to achieve brevity.
 
 Why do you think your estimate of Perl 6
 usage of it is so much lower than is
 true for the standard Perl 5 functions?

If a subroutine explicitly needs access to its invocant's topic, what is so
wrong with having an explicit read-write parameter in the argument list that
the caller of the subroutine is expected to put $_ in?

It makes it clear.

If I understand all this correctly, as is, this access caller's topic
is an unrestricted licence to commit action at a distance.

Accessing the caller's topic is the default in perl5. And there is still a
steady stream of bugs to p5p where core perl modules are doing something
(typically a while loop) which tramples on $_, and so makes something go
wrong in their caller. (possibly several levels down)

(And for that matter the obvious solution of local ($_) in perl5 is also
action at a distance if $_ is tied, as local is an immediate fetch and a
store at end of scope. Special case local on $_ ?)

Nicholas Clark
-- 
perl6 better than perl (this week)?   http://www.perl.org/advocacy/spoofathon/
[Alledgedly some judging activity soon. Yeah, right. Pull the other one]



Re: Unifying invocant and topic naming syntax

2002-11-13 Thread Luke Palmer
 Date: Wed, 13 Nov 2002 20:34:49 +
 From: Nicholas Clark [EMAIL PROTECTED]
 
 
 If a subroutine explicitly needs access to its invocant's topic, what is so
 wrong with having an explicit read-write parameter in the argument list that
 the caller of the subroutine is expected to put $_ in?
 
 It makes it clear.
 
 If I understand all this correctly, as is, this access caller's topic
 is an unrestricted licence to commit action at a distance.
 
 Accessing the caller's topic is the default in perl5. And there is still a
 steady stream of bugs to p5p where core perl modules are doing something
 (typically a while loop) which tramples on $_, and so makes something go
 wrong in their caller. (possibly several levels down)
 
 (And for that matter the obvious solution of local ($_) in perl5 is also
 action at a distance if $_ is tied, as local is an immediate fetch and a
 store at end of scope. Special case local on $_ ?)

Indeed.  And also mind that many (IIRC all, but I could be wrong)
Perl5 builtins used $_ as the Idefault, and if a parameter was
supplied it would use that.

My favorite was from ages ago:

sub bar(;$foo //= $_) {...}

'Course that could be mistaken for defaulting to the current $_ in
Cbar's lexical scope.  Regardless, IMO it is better style to always
use $_ as just a default, rather than a requirement.  Is there a good
reason to have subs like this:?

sub bar($foo) is given($baz) {...}

Or, if you stick with Perl5 convention, and I imagine this is what
people will expect from the builtins at least:

sub bar($foo; $baz) is given($baz) {...}

That duplicated parameter looks strange, and people will be wary of
using it that way (as I was).  I don't know what it looks like, but it
doesn't look like $baz gets $_ if not, well, Cgiven.

Luke



Access to caller's topic (was Re: Unifying invocant and topic naming syntax)

2002-11-13 Thread Me
 access caller's topic is an unrestricted
 licence to commit action at a distance.

Right.

Perhaps:

 o There's a property that controls what subs
   can do with a lexical variable. I'll call
   it Yours.

 o By default, in the main package, topics are
   set to Yours(rw); other lexicals are set to
   not Yours.

 o A mechanism exists for a sub to bypass this
   access control for use with library routines.

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-13 Thread Andrew Wilson
On Wed, Nov 13, 2002 at 08:34:49PM +, Nicholas Clark wrote:
 If a subroutine explicitly needs access to its invocant's topic, what is so
 wrong with having an explicit read-write parameter in the argument list that
 the caller of the subroutine is expected to put $_ in?

It's the difference between this:

print;

and this:

print $_;

It is as far as I'm concerned exactly what topic is all about.  It let's
you write subroutines that behave like builtins with respect to $_.  I
think it's generally intended to be used like so:

sub my_print is given($default) {
  my args = _ // $default;
  ...
}

i.e. only doing stuff with $_ if no explicit parameters are passed.

 It makes it clear.
 
 If I understand all this correctly, as is, this access caller's topic
 is an unrestricted licence to commit action at a distance.
 
 Accessing the caller's topic is the default in perl5. And there is still a
 steady stream of bugs to p5p where core perl modules are doing something
 (typically a while loop) which tramples on $_, and so makes something go
 wrong in their caller. (possibly several levels down)

I don't think that'll be a massive problem with this.  It's not the same
thing at all because $_ is now lexical it's not passed to stuff you call
unless it specifically asks for it.  This will eliminate the trampling
over $_ several levels down.  Needlessly messing with caller's $_ will
become like not using strict or warnings.  Occasionally useful but
generally frowned on in a don't do that kind of way.

andrew
-- 
Gemini: (May 21 - June 21)
Disappointment is yours when you overestimate the power of the
human spirit.



msg12018/pgp0.pgp
Description: PGP signature


Re: Unifying invocant and topic naming syntax

2002-11-11 Thread Damian Conway
ralph wrote:


If the syntax for passing it to a sub
remains as verbose as it currently is,
you are probably right that it won't
be used to achieve brevity!


You're confusing brevity of declaration with brevity of use.
Declarations should always be relatively verbose.



Why do you think your estimate of Perl 6
usage of it is so much lower than is
true for the standard Perl 5 functions?


Because I don't believe many people write subroutines that
default to $_ or that rely on some particular value of $_.
In Perl 5, relying on $_ is fraught with peril, since its
global nature means you have to be wary of what happens to
it in any nested calls as well.

We ought not make that peril any easier to fall into in
Perl 6. Making $_ lexical goes a long way towards that.
Making (limited) circumvention of that lexicality depend on
a verbose and explicit syntax will help too.



Btw, can I just confirm that one can't do:

sub f ($a = mumble) { ... }
or
sub f (;$_ = mumble) { ... }

where mumble is the upscope it and $_
is the sub's topic.


I seriously doubt it but, as always, that's up to Larry.
If it were allowed, the syntaxes might be something like:

  sub f ($a = $CALLER::_) { ... }

  sub f (;$_ = $CALLER::_) { ... }



Naturally, I see this as another symptom
of the way upscope it is being treated
as a second class citizen,


No. It's just not being treated as a parameter.
Because it isn't one.



and that this is leading things in the wrong direction.


Actually, I'm very happy with the direction it's being led.




Besides, what's wrong with:

 $foo = sub { print $_ } is given($_);



Compared with

$foo = sub { print $^_ };

The answer is brevity, or lack thereof.


But, even if $^_ *were* synonymous with $_, it
still wouldn't do what you want. The placeholder
in:

  $foo = sub { print $^_ };

makes the closure equivalent to:

  $foo = sub ($_) { print $_ };

which expects the topic to be passed as the argument of the
subroutine, *not* inherited out-of-band from the caller's
scope.

If you're proposing that there be some special exemption for
$^_ so that it (a) doesn't placehold a parameter and (b)
aliases the caller's topic instead, then I'm vehemently opposed,
since it makes $^_ a kind of *anti*-placeholder.

Introducing that kind of inconsistency would be playing straight
into Simon's hands! ;-)



Why bother with currying?


You mean placeholders. Currying is something else entirely.



Why bother with the it concept? None of these are necessary.
They simplify code generation, but their more
general feature is enabling brevity.


Of usage, yes, but not necessarily of declaration.

Damian




Re: Unifying invocant and topic naming syntax

2002-11-11 Thread Me
 You're confusing brevity of declaration
 with brevity of use.

One needs sufficient brevity of both call
and declaration syntax if the mechanism's
brevity is to be of use in short scripts.


 Making (limited) circumvention of [$_'s
 lexicality] depend on a verbose and
 explicit syntax will help too.

Sometimes verbosity doesn't matter, but
I don't see how it can ever help. I'd buy
clarity.

More to the point, the declaration syntax
will not help with avoiding accidents at
the time of call. So what is driving you
guys to deliberately avoid a brief def
syntax?


   $foo = sub { print $^_ }; # shorthand for
   $foo = sub { print $_ } is given($_);
 
 If you're proposing that there be some special
 exemption for $^_ so that it (a) doesn't
 placehold a parameter and (b) aliases the
 caller's topic instead

Well it clearly does placehold something.

In

method f ($self : $a) { ... }
sub f ($a) is given ($line) { ... }

what do you call $self and $line? I am
talking about being able to placehold
these things, whatever you choose to call
them.


  Why bother with currying?
 
 You mean placeholders.

I meant currying. (I was listing mechanisms
that I believed existed to enable coding
brevity.)


--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-11 Thread Damian Conway
ralph wrote:

 So what is driving you

guys to deliberately avoid a brief def
syntax?


Can't speak for Larry. But what's driving me is the desire
to balance conciseness with comprehensibility, and to keep the
overall cognitive load manageable.



If you're proposing that there be some special
exemption for $^_ so that it (a) doesn't
placehold a parameter and (b) aliases the
caller's topic instead


Well it clearly does placehold something.


Sure. It's placeholds a parameter named $^_, which
may or may not be equivalent to a parameter named $_
(Larry will need to rule on that bit).



In

method f ($self : $a) { ... }
sub f ($a) is given ($line) { ... }

what do you call $self 

The invocant.


and $line?


A lexical variable that happens to be bound to the caller's topic.



I am talking about being able to placehold
these things, whatever you choose to call
them.


You can't placehold the invocant, since placeholders create subroutines,
not methods.

We probably *could* find a notation to placehold the Cis given variable,
but I just can't see the need, when all you have to do now is write
Cis given($var) after the closure.



Why bother with currying?


You mean placeholders.


I meant currying. (I was listing mechanisms
that I believed existed to enable coding
brevity.)


Currying is more about efficiency and algorithmic integrity than
brevity. In fact, I would argue that it explciitly *not* about brevity.
Compare:

	$incr = add.assuming(x=1);

with:

	$incr = { add(1,$^y) };

The currying syntax was (deliberately) chosen to be verbose because
powerful or unusual things should be clearly marked.


Ultimately we're discussing philosophy, which is a waste of time since
we are unlikely to convince each other. I think we should just agree
to disagree here, and let Larry decide.

Damian




Re: Unifying invocant and topic naming syntax

2002-11-11 Thread Me
  method f ($self : $a) { ... }
  sub f ($a) is given ($line) { ... }
  
  what do you call $self 
 
 The invocant.
 
  and $line?
 
 A lexical variable that happens to be
 bound to the caller's topic.

The invokit perhaps?


 placeholders create subroutines, not methods.

Oh.

Are placeholders only usable with anonymous
subs, or named subs too?

Switching briefly to currying, can one curry
a method?


--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-07 Thread Damian Conway
ralph wrote:


My estimate (based on the -- not inconsiderable --
code base of my own modules) is closer to 5%.


Your estimate of what others will do when
knocking out 10 line scripts in a hurry,
or what's in your current p5 modules?


Both.



Can currying include the given topic?

sub bar is given($foo) {
...
}

$foo = bar.assuming( foo = 0 )


Maybe. Depends whether we treat the topic specifier as an out-of-band
parameter mechanism. Personally, I'm leery of doing that, but Larry might
well feel it's okay.


And what about a topic placeholder:

$foo = { print $^_ };

such that $^_ is effectively converted to
an 'is given($^_)'.


No, that doesn't work. The placeholder $^_ is
entirely unrelated to $_. Besides, what's wrong with:

 $foo = sub { print $_ } is given($_);

???

Damian




Re: Unifying invocant and topic naming syntax

2002-11-07 Thread Me
Damian:
 [it will be passed to about 5% of subs,
  regardless of whether the context is your
  10 line scripts or my large modules]

If the syntax for passing it to a sub
remains as verbose as it currently is,
you are probably right that it won't
be used to achieve brevity! I think it's
a pity given that the core point of it
is to achieve brevity.

Why do you think your estimate of Perl 6
usage of it is so much lower than is
true for the standard Perl 5 functions?

Btw, can I just confirm that one can't do:

sub f ($a = mumble) { ... }
or
sub f (;$_ = mumble) { ... }

where mumble is the upscope it and $_
is the sub's topic.


  Can currying include the given topic?
 
 Maybe.

Naturally, I see this as another symptom
of the way upscope it is being treated
as a second class citizen, and that this
is leading things in the wrong direction.


  And what about a topic placeholder:
  
  $foo = { print $^_ };
  
  such that $^_ is effectively converted
  to an 'is given($^_)'.
 
 No, that doesn't work. The placeholder
 $^_ is entirely unrelated to $_.

Well, it is at the moment, but there is
clearly mnemonic value between $^_ and $_.


 Besides, what's wrong with:
 
   $foo = sub { print $_ } is given($_);

Compared with

$foo = sub { print $^_ };

The answer is brevity, or lack thereof.

Why bother with currying? Why bother with
the it concept? None of these are necessary.
They simplify code generation, but their more
general feature is enabling brevity.


--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-05 Thread Damian Conway
ralph hypothesized:


My imagination suggests to me that in a
typical short perl 6 script, between 20%
and 50% of all sub defs would use the
upscope topic... ;


That's some imagination you've got there! ;-)

My estimate (based on the -- not inconsiderable -- code base of
my own modules) is closer to 5%.

But that's beside the point. The two factors that nix this idea
IMHO are that:

	* Putting a non-parameter in the parameter list
  is Just Plain Wrong

	* Using a single character to denote the use of
  an upscope topic is insufficiently obvious
	  (regardless of which character is used for
  the purpose)

Damian




Re: Unifying invocant and topic naming syntax

2002-11-05 Thread Allison Randal
On Tue, Nov 05, 2002 at 05:13:45AM -0600, Me wrote:
  relatively few subroutines need access
  to the upscope topic.
 
 Well, this is a central issue. What are
 the real percentages going to be here?
 Just how often will one type the likes
 of
 
 - is given($foo is topic) { ... }
 
 rather than
 
 - $foo: { ... }
 
 ?
 
 My imagination suggests to me that in a
 typical short perl 6 script, between 20%
 and 50% of all sub defs would use the
 upscope topic... ;
 
 Seriously, the functions chapter of Camel
 III contains 202 functions; 36 of these
 use the upscope topic.

The fact that accessing the upscope topic is common enough to be useful
is why we decided to provide an easy way to do it.

But compare that frequency to the frequency of addition. 

  Moreover, because ['is given'] compromises
  the lexical scoping of the upscope topic,
  it ought to be marked very clearly
 
 Yes.

Which is another reason why it shouldn't be too easy.

 So that gives an idea of what to expect --
 although there is likely to be /more/ use
 of tricks like this that support brevity
 when advanced coders specifically wish to
 write brief scripts.
 
 Unless of course the very syntax that
 creates /call/ brevity is itself so
 verbose that it neutralizes some of its
 utility in such cases, something that
 would be rather ironic, don't you think?

I don't consider the ability to write brief code to be the chief goal of
language design. One of the goals, sure. No one wants to type:

is the_property_that_provides_access_to_the_topic_in_the_callers_scope($foo is
the_current_topic_in_the_block)

But brevity is a lower goal than clarity and ease of maintenance. It's
a balance, like everything in language design (and life in general). 

  [keywords are clearer than punctuation for
   marking something]
 
 I think that's overly general.
 
 In something that is as likely to be naturally
 keyword dense as a sub or method definition, I
 imagined the situation would be near reverse,
 i.e. well chosen punctuation would often be a
 better pick than YAK for marking something.
 
 (Maybe colon isn't it, but I didn't pick that.)
 
 Of course, in code written to be brief, sub
 defs would tend to be less keyword, but then
 again, in code written to be brief, brevity
 would again suggest punctuation.
 
 So perhaps punctuation wins in both cases;
 in large projects sub defs will be keyword
 dense and punctuation would better highlight
 it and in small scripts, punctuation in
 sub defs would be desirable for brevity.

It's a balance again. You can't just look at the one feature in
isolation and decide if it's better off as a keyword or punctuation. You
have to look at the whole language as a system and decide which features
most deserve punctuation. Even if we have the option of unicode
punctuation, moderation is still desirable. The logical extreme of a
language that prefers punctuation is something like:

$%(_^?.)*!+-# 

I'm sure that's not what you meant, or what you want, but it illustrates
the point that more punctuation leads toward less clarity. Somewhere
between the insanity of all punctuation and the verbosity of no
punctuation lies the happy medium.

Allison

-- 
Punctuation is the spice of life.



Re: Unifying invocant and topic naming syntax

2002-11-04 Thread Allison Randal
On Sun, Nov 03, 2002 at 11:17:32PM -0600, Me wrote:
 
 I started with a simple thought:
 
 is given($foo)
 
 seems to jar with
 
 given $foo { ... }
 
 One pulls in the topic from outside and
 calls it $foo, the other does the reverse --
 it pulls in $foo from the outside and makes
 it the topic.

It comes from is using 'given' as a noun (meaning the same thing as
'topic') instead of a verb. So, this:

  given $foo { ... }

means make $foo become the given or Given-ify $foo. While:

  is given($foo)

means $foo takes the value of the given.

There may be room for a better parameter name. We considered quite a few
before picking this one, though, and I'm pretty happy with it for now.

 On its own this was no big deal, but it got
 me thinking.
 
 The key thing I realized was that (naming)
 the invocant of a method involves something
 very like (naming) the topic of a method,
 and ultimately a sub and other constructs.

The similarity is that both are implicit parameters, i.e. they're
accessible to the sub/method but aren't explicitly passed when it's
called. They're not quite the same though, as the Cis given parameter
is entirely out-of-band (in P5 terms, it wouldn't appear in _).

Also, both may be the topic under certain circumstances. But then, any
variable can be the topic.

Generally, there's no conceptual link between the invocant of a method
and the topic in the caller's scope. 

 Thus it seems that whatever syntax you pick
 for the former is likely to work well for
 the latter.
 
 Afaik, the syntax for invocant naming is:
 
 method f ($self : $a, $b) { ... }
 
 But whatever it is, I think one can build
 on it for topic transfer / naming too in a
 wide range of contexts.
 
 With apologies for talking about Larry's
 colon, something that really does sound
 like it is taboo for good reason, I'll
 assume the above invocant naming syntax
 for the rest of this email.
 
 So, perhaps:
 
 sub f ($a, $b) is given($c) { ... }
 sub f ($a, $b) is given($c is topic) { ... }
 sub f ($a, $b) is given($_) { ... }
 
 could be something like:
 
 sub f ($c : $a is topic, $b) { ... }
 sub f ($c : $a, $b) { ... }
 sub f ($_ : $a, $b) { ... }
 
 where the first arg to be mentioned is the
 topic unless otherwise specified.
 
 (The first line of the alternates is not
 semantically the same as the line it is a
 suggested replacement for, in that the
 current scheme would not set the topic --
 its value would be the value of $_ in
 the lexical block surrounding the sub
 definition. It's not obvious to me why
 the current scheme has it that way and
 what would best be done about it in the
 new scheme I suggest, so I'll just move on.)

Even though both features have something to do with topic, they're
really independent. There are times when it's useful to access the
caller's topic without setting the current topic and times when it's
useful to just set the current topic.

  sub f ($a, $b) { ... } # use neither feature
  sub f ($a is topic, $b) { ... } # topic setting
  sub f ($a, $b) is given($c) { ... } # access caller's topic 
  sub f ($a, $b) is given($c is topic) { ... } # combine

When you have a system with two independent but interacting features,
it's far more efficient to define two independent flags than to define 4
flags to represent the 4 combinations. It's also easier to learn.

 The obvious (to me) thing to do for methods
 is to have /two/ colon separated prefixes of
 the arg list. So one ends up with either one,
 two, or three sections of the arg list:
 
 # $_ is invocant:
 method f ($a, $b) { ... }
 
 # $_ and $self are both invocant:
 method f ($self : $a, $b) { ... }
 
 # $_/$self are invocant, $c caller's topic
 method f ($self : $c : $a, $b) { ... }

Any two constructs with the same syntax but an entirely different
meaning exponentially increase the chance of confusion. Confusion
increases the likelyhood of bugs. Not to mention frustrating the
programmer. 

 One question is what happens if one writes:
 
 method f (: $c : $a, $b) { ... }
 
 Is the invocant the topic, or $c, ie what
 does a missing invocant field signify?

The invocant would be the topic still. It is now with:

method f (: $a, $b) { ... }

 Jumping to a different topic for one moment,
 I think it would be nice to provide some
 punctuation instead of (or as an alternate
 to) a property for setting 'is topic'. Maybe:
 
 method f ($self : $c : $a*, $b) { ... }
 
 or maybe something like:
 
 method f ($self : $c : $aT, $b) { ... }
 
 (Unicode TM for Topic Marker? Apologies if I
 screwed up and the TM character comes through
 as something else.)

Huffman encoding comes to mind. Is this really common enough to merit a
single punctuation character?

 Anyhow, a further plausible tweak that builds
 on the above colon stuff is that one could
 plausibly do:
 
 sub f ($bar : $a, $b) {
 ...
 }
 
 and then call f() like so:
 
 f (20 : 30, 40)
 
 as a 

Re: Unifying invocant and topic naming syntax

2002-11-04 Thread Me
  (naming) the invocant of a method involves
  something very like (naming) the topic
 
 Generally, there's no conceptual link...

other than 

 The similarity is that both are implicit
 parameters

which was my point.

Almost the entirety of what I see as relevant
in the context of deciding syntax for naming
the invocant is that it's an especially
important implicit argument to methods that
may also be the topic.

Almost the exact same thing is true of the
topic, with the exception being that it
applies to subs as well as methods.

It's clear you could have come up with
something like one of these:

method f ($a, $b) is invoked_by($self)
method f ($a, $b) is invoked_by($self is topic)
method f ($a, $b) is invoked_by($_)

but you didn't. Any idea why not?


 There are times when it's useful to access
 the caller's topic without setting the current
 topic and times when it's useful to just set
 the current topic.
 ...
 When you have a system with two independent
 but interacting features, it's far more
 efficient to define two independent flags
 than to define 4 flags

Of course. The general scheme I suggested
doesn't impinge on this one way or the other.

But the specifics I suggested made a different
choice for the default situation.

As you said of the current scheme:

The following example will either print
nothing, or else print a stray $_ that is
in lexical scope wherever the sub is defined.

sub eddy ($space, $time) {
print;
}

In the scheme I suggest the first arg is the
topic by default (just as is the case for the
other topicalizers such as pointy sub, for,
etc in the current scheme). I think this
choice makes sense, but then, as I implied,
maybe I'm missing something.


  method f ($self : $c : $a*, $b) { ... }

(where * is short for 'is topic'.)

 Is this really common enough to merit a single
 punctuation character?

If I didn't think so I wouldn't have suggested
the shortcut. ;


  Anyhow, a further plausible tweak that builds
  on the above colon stuff is that one could
  plausibly do:
 
 So, in this system, the colon is used for both
 explicit parameters and implicit parameters.
 ...
 I'd prefer more consistency.

If by system you mean the scheme I suggested
prior to this plausible tweak, then no. The
colon would only be used in this way if one
introduced the tweak. Rejecting this tweak has
no impact on the value of the general scheme
I suggested.

The colon in my scheme (not the tweak) can
optionally be used to be explicit in sub
*defs* about otherwise implict args. The
tweak I am suggesting is that one could,
optionally, use the exact same syntax to
be explicit in sub *calls* about otherwise
implicit args. I think this has a clean
consistency.


  given $c : $foo {
  # $c = outer $_
  }
 
 It would be much more transparent to simply
 name the outer topic.

How is this so different to

method f ($c : $foo) {
# $c = invocant
}

?


 
 Allison

--
ralph



Re: Unifying invocant and topic naming syntax

2002-11-04 Thread Damian Conway
ralph wrote:


It's clear you could have come up with
something like one of these:

method f ($a, $b) is invoked_by($self)
method f ($a, $b) is invoked_by($self is topic)
method f ($a, $b) is invoked_by($_)

but you didn't. Any idea why not?


Because most methods need some kind of access to their own invocant,
but relatively few subroutines need access to the upscope topic.
So the syntax for invocant specification should be compact,
and the syntax for external topic access should be less so.

Moreover, because the latter mechanism compromises the lexical
scoping of the upscope topic, it ought to be marked very clearly
(i.e. with a keyword, rather than a single colon).



   method f ($self : $c : $a*, $b) { ... }




(where * is short for 'is topic'.)


Too short, IMHO.

For such a non-standard method definition, I'd *very* much rather
maintain a syntax like:

	method f ($self : $a is topic, $b) is given($c) { ... }

which clearly marks all the irregularities.

Not to mention that this more explicit syntax doesn't inject a spurious
pseudoparameter into the parameter list.

Damian




Unifying invocant and topic naming syntax

2002-11-03 Thread Me
I read Allison's topicalization piece:

http://www.perl.com/pub/a/2002/10/30/topic.html

I started with a simple thought:

is given($foo)

seems to jar with

given $foo { ... }

One pulls in the topic from outside and
calls it $foo, the other does the reverse --
it pulls in $foo from the outside and makes
it the topic.

On its own this was no big deal, but it got
me thinking.

The key thing I realized was that (naming)
the invocant of a method involves something
very like (naming) the topic of a method,
and ultimately a sub and other constructs.

Thus it seems that whatever syntax you pick
for the former is likely to work well for
the latter.

Afaik, the syntax for invocant naming is:

method f ($self : $a, $b) { ... }

But whatever it is, I think one can build
on it for topic transfer / naming too in a
wide range of contexts.

With apologies for talking about Larry's
colon, something that really does sound
like it is taboo for good reason, I'll
assume the above invocant naming syntax
for the rest of this email.

So, perhaps:

sub f ($a, $b) is given($c) { ... }
sub f ($a, $b) is given($c is topic) { ... }
sub f ($a, $b) is given($_) { ... }

could be something like:

sub f ($c : $a is topic, $b) { ... }
sub f ($c : $a, $b) { ... }
sub f ($_ : $a, $b) { ... }

where the first arg to be mentioned is the
topic unless otherwise specified.

(The first line of the alternates is not
semantically the same as the line it is a
suggested replacement for, in that the
current scheme would not set the topic --
its value would be the value of $_ in
the lexical block surrounding the sub
definition. It's not obvious to me why
the current scheme has it that way and
what would best be done about it in the
new scheme I suggest, so I'll just move on.)

Anyhow, the above is my suggestion for an
alternate to 'is given' in a sub definition.

The obvious (to me) thing to do for methods
is to have /two/ colon separated prefixes of
the arg list. So one ends up with either one,
two, or three sections of the arg list:

# $_ is invocant:
method f ($a, $b) { ... }

# $_ and $self are both invocant:
method f ($self : $a, $b) { ... }

# $_/$self are invocant, $c caller's topic
method f ($self : $c : $a, $b) { ... }

One could have incantations such as:

method f ($self : $c : $a is topic, $b) { ... }
method f ($self : $c is topic : $a, $b) { ... }
method f ($self : $_ : $a, $b) { ... }

which all clobber the invocant being 'it',
but if that's what a method author wants,
then so be it.

One question is what happens if one writes:

method f (: $c : $a, $b) { ... }

Is the invocant the topic, or $c, ie what
does a missing invocant field signify?

Jumping to a different topic for one moment,
I think it would be nice to provide some
punctuation instead of (or as an alternate
to) a property for setting 'is topic'. Maybe:

method f ($self : $c : $a*, $b) { ... }

or maybe something like:

method f ($self : $c : $aT, $b) { ... }

(Unicode TM for Topic Marker? Apologies if I
screwed up and the TM character comes through
as something else.)

Anyhow, a further plausible tweak that builds
on the above colon stuff is that one could
plausibly do:

sub f ($bar : $a, $b) {
...
}

and then call f() like so:

f (20 : 30, 40)

as a shortcut for setting $_ before calling f(),
ie to set $_ in the body of f to 20, $a to 30.

Unfortunately that conflicts with use of colon
as an operator adverb. Conclusion: if y'all
end up using a different syntax for specifying
the variable name of the invocant for a method,
and go with the extension I suggested earlier
for replacing 'is given', then maybe the above
can still work, and maybe it would be a good
idea to allow it.

And if you do, I can see a further trick being:

given $foo {
# $_ = $foo here, hiding outer topic
}

given $c : $foo {
# $_ = $foo here, hiding outer topic
# $c = outer $_
}

And likewise for other topicalizers.

--
ralph