6.2.7 released! | pugscode.org/ <Overview Journal Logs> | pugs.kwiki.org | paste: sial.org/pbot/perl6 Set by autrijus on 13 June 2005. |
|||
stevan_ | I think making roles work in an easily predictable way is extrememly important to their success | 00:00 | |
since they are just another level of class decompostion I dont expect anyone but the OO hackers to use them | |||
but they should still be accessible | |||
so I really want to iron out all the edge cases if we can | 00:01 | ||
ok back to converstation | |||
breadth first is basically what you get when you flatten them | |||
except there is no overlap | 00:02 | ||
it is important in role composition that it is not order dependent | |||
which is trivial is you flatten | 00:03 | ||
because instead of shadowing (like in depth first traversal) conflict are just illegal | |||
so order doesnt matter | |||
mugwump | but it did matter at some point, when the roles themselves were combined | 00:05 | |
stevan_ | nope | ||
it doesnt matter | |||
if they conflict, ... BOOM, .... error | |||
mugwump | ok | ||
stevan_ | so order is irrelecvant | ||
mugwump | so the resolution process basically consists of disallowing the cases where it does matter. fine by me, so long as I can still MMD in methods etc :) | 00:06 | |
stevan_ | yes | ||
although MMD is a whole other topic :) | 00:07 | ||
but thats not my dept. | |||
7 floors up and to the right, ask for autrijus, he is how you need to talk too :) | |||
mugwump | sure. of course you can simplify MMD in concept by viewing the entire signature as a part of the method "name" | 00:08 | |
but that's not important right now | |||
stevan_ | yes, but thats just C++ style, and its not as cool | 00:09 | |
we need type dispatched | |||
Yuval (nothingmuch) has this whole idea of first class signatures which is really cool | |||
but yes, not important right now | |||
mugwump | ok, so we've got these Roles which are simply modelled as a collection of functions, including accessors for "private" attributes which are specially named so they can't conflict or even be accessed between roles etc | 00:11 | |
stevan_ | uhm | ||
thats adding restrictions to the roles though | 00:12 | ||
according to @Larry, there is no such restriction | |||
(for the record I agree with you, but its not my language) | |||
mugwump | :) | ||
but what restriction does Larry speak of? | 00:13 | ||
stevan_ | LOL | ||
none | |||
thats the problem :) | |||
mugwump | Unless the difference is, that role methods are actually considered a part of the class they are composed into, and so can see each other's private attributes and methods | 00:15 | |
stevan_ | yu[ | ||
yup | |||
thats the idea | |||
Roles are flattened in , and tossed out | 00:16 | ||
think of the Role as a cellophane wrapper | |||
you open it, put the contents in your class | |||
and toss the wrapper out | |||
maybe hold onto the instructions (meta-data) to handle things like does(), but thats all | 00:17 | ||
this is how the current perl5 prototype works (without the state part | |||
clkao | mugwump: oh, what's up with the store-password thing in svn::mirror? | ||
mugwump | clkao: well, I think the thing missing is the connection between the svn config object and the auth baton | 00:19 | |
but these objects are pretty much opaque and I couldn't find the docs when I was looking | |||
mugwump ==> #svk | 00:20 | ||
stevan_ wanders off for some foo | 00:25 | ||
mugwump feeds stevan_ some foo at the bar | 00:31 | ||
Khisanth | what exactly is a parrot language? | 00:36 | |
mugwump | PIR? | 00:37 | |
PASM? | |||
Khisanth | ah those | ||
stevan_ | ahhh the smell of schwarma | 01:00 | |
poor Luke, this room is going to stink for a while ;) | 01:01 | ||
mugwump | ok stevan_, I see now why there is a state problem. | 01:02 | |
stevan_ | mugwump: its all about the flattening | 01:03 | |
without it, you are correct, its not an issue | |||
but with it, its bad | |||
mmm, the hummus is good too | |||
Toronto has really great food I have to say | 01:04 | ||
mugwump | So, there are two differences between Roles and Classes. Attribute accessing and method invocation of roles is considered in the scope of the class which it is attached to | ||
(and roles are not instantiated) | |||
stevan_ | yes | ||
think of the {} braces on the class as a closure | 01:05 | ||
which is evaluated at compile time and results in the metamodel being constructed | |||
which can potentially have some really interesting effects if you can access the metaclass in some way | 01:07 | ||
class MyClass { for ('method1', 'method2') -> $label { $?CLASS.meta.add_method($label => sub { print $label } } } | 01:08 | ||
stuff like that could (theoretically) be possible | |||
mugwump | it's like Roles are non-composable Classes that have a parametric *scope* | ||
stevan_ | yes | ||
and Roles can be parameterized too | |||
role Something [ .... T ] { has T $.foo } or something like that, I forget the syntax right now | 01:09 | ||
mugwump | The Set or Tree classes are the ones that would need this and exist as working examples I guess | 01:10 | |
stevan_ | yes actually it would allow for type checking of the nodes of the tree | 01:11 | |
mugwump | So, the scope is basically the same thing as the "local" dispatch table (local being the composed dispatch table for a class) | ||
stevan_ | roughly yes | 01:12 | |
mugwump | for now I'm putting the ::Type object, and the "local" dispatch table into the same little black box | ||
stevan_ | I am not sure about inner classes and such | ||
mugwump | so being typable means that you get a scope | ||
stevan_ | mugwump: yes thats pretty safe I think | ||
mugwump | So, still it is the ::Type object that this "magic" is happening, all that's changed is that we're now using it for the Class' methods' scope | 01:13 | |
and as the Role is not typable, their methods' scope must be attached to a ::Type | 01:14 | ||
but you don't need to throw them away in the MetaModel, especially given you still need to answer .does | |||
stevan_ | currently I gather all the info I need to implement does before I toss it | 01:15 | |
QtPlatypus | ?eval class Foo { has &.subat; method retsub () { .subat()}};my $foo= Foo.new(subat => {1 + 1});$foo.retsub; | 01:16 | |
evalbot6 | \sub {...} | ||
QtPlatypus | That wasn't what I expected. | ||
?eval class Foo { has &.subat; method retsub () { .subat()}};my $foo= Foo.new(subat => {1 + 1});$foo.retsub.(); | 01:17 | ||
evalbot6 | 2 | ||
QtPlatypus | ?eval class Foo { has &.subat; method retsub () { .subat()()}};my $foo= Foo.new(subat => {1 + 1});$foo.retsub; | ||
evalbot6 | 2 | ||
QtPlatypus | ?eval class Foo { has &.subat; method retsub () { .subat}};my $foo= Foo.new(subat => {1 + 1});$foo.retsub; | 01:18 | |
evalbot6 | \sub {...} | ||
QtPlatypus | ?eval class Foo { has &.subat; method retsub () { .subat}};my $foo= Foo.new(subat => {1 + 1});$foo.retsub.perl | ||
evalbot6 | '\\sub {...}' | ||
QtPlatypus | Anyone care to explain why it works that way? | 01:19 | |
stevan_ | QtPlatypus: no :) | 01:20 | |
I think the first one "method retsub () { .subat()}" is probably using the accessor | |||
and so it this one (maybe) "method retsub () { .subat()}" | 01:21 | ||
this is ugly, but it works "method retsub () { .subat()()" | |||
?eval class Foo { has &.subat; method retsub () { &.subat()}};my $foo= Foo.new(subat => {1 + 1});$foo.retsub; | |||
evalbot6 | 2 | ||
QtPlatypus | That makes sence. How would I use the attribute directly? | ||
stevan_ | like that | ||
QtPlatypus | Arh | ||
Ok things make sence. | 01:22 | ||
Odin-LAP | sense, actually. :p | 01:24 | |
svnbot6 | r5083, mugwump++ | Various updates to the pure Perl 6 MetaModel (non-PIL version) to reflect updated interpretation of Roles and Classes | 03:07 | |
r5084, Stevan++ | Perl6-MetaModel : there is nothing like refactoring with +93% coverage :) ... mostly just cleanup of the Perl6::Object module, it is getting pretty slimmed down now | |||
mugwump | stevan: ping | 03:10 | |
stevan | mugwump: pong | 03:11 | |
I see your update | |||
mugwump | excellent. did it make any sense? | ||
stevan | havent looked yet | ||
mugwump | ok | ||
stevan | I am doing so right now | 03:12 | |
mugwump | in particular is the Method.pm | ||
stevan | ok | ||
mugwump | At runtime, a method has *two* types | ||
one type is the $object.ref | |||
The other is the type that corresponds to the type the role was included into | 03:13 | ||
stevan | ok | 03:14 | |
mugwump | the first is used for public accessors and methods, and is subject to dispatch through the Class' superclasses | ||
the second is used for private accessors and methods | |||
so, the first is bound "late" | |||
the second is bound "early" | |||
and a Class is merely a Role that very quickly has all the private parts of its methods bound | 03:16 | ||
stevan | interesting | 03:18 | |
how would you deal with conflicts? | 03:19 | ||
mugwump | when would they be detected? | ||
stevan | class composition time | ||
or role inclusion time | 03:20 | ||
mugwump | same thing :) | ||
stevan | any time you compose the ::Type | ||
yes, basically | |||
mugwump | yes | ||
the actual rules for the conflict resolution are irrelevant to this, of course. | 03:21 | ||
stevan | yes | ||
mugwump | so long as they don't leave the ::Type objects with ambiguous stuff in them | ||
stevan | but thats the hard part :) | ||
mugwump | yes, but minimal rules which exclude many multi methods which could co-exist Shouldn't Be Hardā¢ to implement | 03:22 | |
svnbot6 | r5085, mugwump++ | Ensure Role methods can be re-used between Classes | 04:11 | |
r5086, luqui++ | r147@Queen-of-Hearts: luqui | 2005-06-28 21:56:55 -0400 | 04:19 | ||
r5086, luqui++ | Added some type inferrence musings. | |||
r5087, luqui++ | r148@Queen-of-Hearts: luqui | 2005-06-28 22:14:01 -0400 | |||
r5087, luqui++ | On disjoint sets. | |||
r5088, luqui++ | r149@Queen-of-Hearts: luqui | 2005-06-28 22:29:45 -0400 | |||
r5088, luqui++ | Perhaps we need a new syntax for type variables, or we need to reassign ::. | |||
r5089, mugwump++ | Method dispatch only happens on the compiled dispatch tables, not bothering with the Meta objects | 04:26 | ||
obra | seen autrijus | 04:43 | |
jabbot | obra: autrijus was seen 7 hours 20 minutes 34 seconds ago | ||
nothingmuch | evening | 05:47 | |
seen autrijus | 05:49 | ||
jabbot | nothingmuch: autrijus was seen 8 hours 26 minutes 22 seconds ago | ||
nothingmuch | he was supposed to wake up by now ;-) | ||
Khisanth | go knock on his door? | 05:51 | |
nothingmuch | i'm not staying at the hotel | ||
and it's not nice to wake someone up in the middle of their beau^H^H^H^H^Hhacking sleep | 05:52 | ||
. o O ( why are there so many conflicts ? ) | 05:58 | ||
svnbot6 | r5090, nothingmuch++ | array container implementation | ||
r5091, nothingmuch++ | array is compilable, and tested.. still broken | |||
r5092, nothingmuch++ | Sorry stevan++, here's Scalar | 05:59 | ||
Khisanth wonders if you can do ../../../../method | 06:04 | ||
nothingmuch | Khisanth: .. being superclass or caller? | 06:05 | |
;-) | |||
jql | Didn't &prefix:<../> get shot down? | 06:06 | |
nothingmuch | uh | ||
i thought it was a joke | 06:07 | ||
mugwump | That's a really good idea! | ||
jql | well, considering how ./ isn't a joke. :) | ||
revdiablo | I think Juerd was serious about ../ for about 12 hours | ||
jql | heh | ||
mugwump | and then? :) | ||
QtPlatypus | I thought that it got shot down. | ||
jql | and then we wondered "how could anyone use that?" | 06:08 | |
well, I wondered it | |||
revdiablo | he woke up the next day and realized | ||
jql | I dunno what @Larry thought | ||
Khisanth | well if there is going to be the ugly ./method why not go along with it and have ../../method too? :) | ||
mugwump | ok that's fine for SUPER, but what about NEXT? | 06:09 | |
jql | ./+method # bring it | ||
revdiablo | .->method # ;) | ||
nothingmuch | that's why file systems need continuations | 06:10 | |
coral | i like talk like that | 06:11 | |
nothingmuch++ | |||
coral gets out the pom-poms | |||
nothingmuch | bah, it's 2 am | ||
coral | could perlfs.sourceforge.net/ be ported to pugs? | 06:12 | |
nothingmuch | and I'm screwing around with PIL underlying runtime stuff | ||
instead of working on my talk | |||
Khisanth | nothingmuch: following in tradition? | 06:16 | |
svnbot6 | r5093, nothingmuch++ | Testing is good for you | ||
gaal | hello. what should the prelude be compiled to with the fast-prelude scenario? pugs ast? something else? what target do we always have? what would be easy to dump partially and later inject to the environment? | 06:17 | |
PIL? | 06:18 | ||
revdiablo | previously known as PAST | ||
nothingmuch | hola PIL | 06:19 | |
err, gaal | |||
gaal | that's why it was called that. | ||
it was called past in the past. | |||
revdiablo | heh | ||
in the past PIL was called PAST, duh. | |||
Khisanth | DR. PHIL | 06:20 | |
gaal | aloha nm | ||
nothingmuch | gaal: i have a new laptop | 06:21 | |
gaal | "become new"! :) | ||
nothingmuch | i actually had it before, but i forgot to tell you | ||
thanks =) | |||
gaal | (not sure they speak inglezit on the chanell) | ||
nothingmuch | uh, how did an ingy module work without YAML installed?! | 06:23 | |
holy crap, this computer is so fast | 06:24 | ||
nothingmuch is going to run the Regexp::Common test suite, just to see it go fast | |||
gaal | why does script/pugscc still mention 'dump.ast'? i thought that was obsoleted? | ||
....why is pugscc still written in p5? :) | |||
nothingmuch | uh | 06:25 | |
gaal | i 80% ported it once when i wanted to fix the cygwin path ickiness, but was missing some features. i imagine those are already available | 06:26 | |
but well, i guess it works now and is probably faster than a p6 version... | 06:27 | ||
gaal looks for food | 06:29 | ||
Khisanth | hmm | ||
where can I find more info on .as()? or can that bible thing tell me? :) | 06:46 | ||
nothingmuch | woah, i'm 20 | 07:06 | |
gaal | happy birthday! | ||
obra | happy birthday, nothingmuch | 07:08 | |
gaal | ?eval sub f {say "not said"}; f(); say "said" | 07:39 | |
evalbot6 | said bool::true | ||
gaal | why is "not said" not said? | ||
QtPlatypus | could be the say saftly thing | 07:40 | |
gaal | ?eval sub fatal { die; die; die } fatal(); say "immortal" | ||
evalbot6 | immortal bool::true | ||
gaal | nope, same thing in one-liner. | 07:41 | |
Khisanth | hmm | ||
gaal | dispatching is very b0rked! | ||
?eval no_such(); say "alive" | |||
evalbot6 | Error: No compatible subroutine found: "&no_such" | ||
gaal | this is very bad :) | 07:42 | |
Khisanth | hmm do that enough times and I get undef | 07:43 | |
instead of bool::true | |||
gaal | the bool::true is simply the valuation of the last say | ||
QtPlatypus | ?eval my $a=1;sub foo () {$a++}; foo(); $a | 07:44 | |
evalbot6 | \1 | ||
Khisanth | but why should say start returning undef all of a sudden? | ||
gaal | why should functions not be called all of a sudden? the current r is not sane. | ||
Khisanth | well that is for sure :) | 07:45 | |
gaal svn log -v's for possible recent culprits | 07:46 | ||
Khisanth | ok returning doesn't seem to work at all | 07:47 | |
gaal | backtracing, 5039 now | 07:51 | |
make unoptimized++ | |||
b0rkage == r5040 | 07:53 | ||
hmm, i don't understand why this breaks! evalExp circa line 309 *does* get called. | 08:18 |