--- Larry Wall <[EMAIL PROTECTED]> wrote:
> On Thu, Nov 27, 2003 at 08:08:05PM -0800, Paul Hodges wrote:
> : --- Larry Wall <[EMAIL PROTECTED]> wrote:
> : > ... in fact, we may be limiting the creation of properties
> : > to predeclared names, so that even
> : > 
> : >     return 0 but ture;
> : > 
> : > can be caught at compile time.
> : 
> : Excellent, so long as we can define new properties explicitly.
> : At the moment, I draw a complete blank on how to do that.
> : 
> : Somebody drop me an example?
> 
> Well, it hasn't been defined yet.  Likely there will be some syntax
> 
>     my property foo;
> 
> that is shorthand for something vaguely resembling
> 
>     my role foo is property {
>       has $.foo is rw;
>     }
That's cool. You might even consider making declarable properties a
little *less* convenient, though.... Of course, I bet you *have*
considered it, lol.

> However, universal properties like "true" and "tainted" are likely to
> be declared implicitly everywhere:
> 
>     property *true;
>     property *tainted;
> 
> Less common properties are likely to be imported into a lexical
> scope.

hmm... lexical properties....I've read the rest of the message, and I
see how this could be a problem. Just to be clear on it, what exactly
would it mean for a property or trait to be lexical? If a value or
container with that aspect gets passed out of that scope, what happens?
 
Wouldn't an object efectively provide a virtual "scope" of its own?

> So you'd likely only declare properties that you use entirely by
> yourself, or that you intend to export.  If you really want to mess
> everyone up, though, you could certainly declare things like:
> 
>     property *ture;

And I can certainly see someone doing just that.
False laziness, false impatience, false hubris.... :)

> Actually, there's something to be said for declaring all property
> names as globals, since they cut across object classes, and you
> wouldn't want to add two different properties of the same name to
> a given object.

Agreed.
Maybe the syntax looks something like this:

  class Foo has Scalar bar is rw = undef; # suplies a default value;

That would allow you to add the property to the class with a default
value at compile time, wouldn't it? Then you could modify objects:

  my $o = Foo.new;
  $o.foo but= "stuff";

It would also make it inherently class scoped, and would fail to
compile if someone in another module had already declared a property
bar. Right?

> Or maybe we can tag property names with the scope in which they're
> declared somehow.

o. That's hairy, isn't it?
Yes, I think it would be useful...but what's the upshot? The value of
$o.foo is dependent on scope? Hmm.... My first reaction was to frown
and shudder, but maybe that's short-sighted. Any lexical variable's
value is always dependent on scope.

  our $foo = 1;
  { my $foo = 2;
    print $foo; # 2
  } 
  print $foo; # 1

I'm just not sure how I like the idea of that applying to properties.

  our $o = Foo.new();
  $o.foo but= "global?";
  dostuff::with($o); # module scope, different value?

Wouldn't that utterly mangle the principle of least surprise?

> Larry


__________________________________
Do you Yahoo!?
Free Pop-Up Blocker - Get it now
http://companion.yahoo.com/

Reply via email to