»ö« Welcome to Perl 6! | perl6.org/ | evalbot usage: 'perl6: say 3;' or rakudo:, niecza:, std:, or /msg p6eval perl6: ... | irclog: irc.perl6.org/ | UTF-8 is our friend! | Rakudo Star Released!
Set by diakopter on 6 September 2010.
ash_ say 0.so, 0.defined 00:13
rakudo: say 0.so, 0.defined
p6eval rakudo 0421d3: OUTPUT«Bool::FalseBool::True␤»
sorear .so and .Bool are synonyms, except for some confusing cases with junctions 00:16
flatwhatson is that so you can write if so { do_stuff() } ? 00:18
sorear you can't write if so anyway 00:20
it would have to be if .so 00:21
plobsing sub make-it-so($x is rw) { $x but= True }
ash_ rakudo: my $_ = 12; given :so { say 1 } 00:22
p6eval rakudo 0421d3: OUTPUT«===SORRY!===␤Redeclaration of symbol $_ at line 22, near " = 12; giv"␤»
ash_ rakudo: $_ = 12; given :so { say 1 }
p6eval rakudo 0421d3: OUTPUT«1␤»
ash_ rakudo: $_ = 12; if .so { say 1 } 00:23
p6eval rakudo 0421d3: OUTPUT«1␤»
sorear rakudo: $_ = 12; given :so { .say }
p6eval rakudo 0421d3: OUTPUT«so Bool::True␤»
sorear # I don't think given does what you think it does
ash_ rakudo: say 12 ~~ :so
p6eval rakudo 0421d3: OUTPUT«Bool::True␤»
ash_ ah ya
i meant to say when
oops
rakudo: $_ = 12; when :so { .say } 00:24
p6eval rakudo 0421d3: OUTPUT«12␤»
ash_ rakudo: $_ = 12; if .so { .say }
p6eval rakudo 0421d3: OUTPUT«12␤»
sorear rakudo: say 12 ~~ .so # I think Pair.ACCEPTS is deprecated, this is how we do it now 00:26
p6eval rakudo 0421d3: OUTPUT«Bool::True␤»
wolfman2000 ...is there really a big difference between if and when? They seem to do the same thing 00:28
plobsing rakudo: given (42) { if 1..3 { say "small" }; when 42 { say "other" } } 00:31
p6eval rakudo 0421d3: OUTPUT«small␤other␤»
plobsing rakudo: given (42) { when 1..3 { say "small" }; when 42 { say "other" } } 00:32
p6eval rakudo 0421d3: OUTPUT«other␤»
ash_ when does a lot more than if 01:20
masonkramer define "more" 01:26
I think they just do very different things 01:27
masonkramer blogs.gurulabs.com/stephen/2008/12/...nwhen.html 01:28
LaVolta morning #perl6 01:44
sorear heya 01:55
araujo hi 02:06
xinming is pugs svn repository down? 03:50
plobsing xinming: pugs repo is gone (see use.perl.org/~masak/journal/40524) 04:00
xinming plobsing: thanks 04:08
plobsing: Where is the old pugs svn repository? 04:10
xinming Just curious. 04:15
plobsing /dev/null I guess. 04:16
sorear xinming: Juerd probably has it on a backup tape somewhere 04:30
xinming: Looking for something?
sorear xinming: Juerd probably has it on a backup tape somewhere 04:34
xinming_: Looking for something?
xinming_ sorear: Nope, Just want to keep the "history" :-) 04:44
sorear xinming_: we imported the entire history into git 05:11
xinming_: if anything the history is more accessible now, since git clones default to "all history" 05:12
hmm. I have an Interesting metamodel freeze/thaw problem 05:14
if a Unit references several other Units, then loading it will clone them all 05:15
maybe I should look at something like kioku
plobsing sorear: shouldn't you maintain a unique reference to be able to de-dup unit loads (and therefor avoid clones)? 05:18
sorear plobsing: that's the problem, I'm trying to find the best way to do "unique reference" 05:24
sorear is also still trying to figure out exactly how packages want to work 05:25
currently the best I've been able to come up with is to, instead of actually referencing the objects, store the unit name + a per-unit ID number 05:26
mfollett Is there a synopsis or other document that'd clue me in on how to add a subroutine to a module dynamically?
or
source, that would work too, sorry for so many lines here
sorear S11 maybe, though it depends on exactly what you mean 05:28
subroutine handling is a lot less dynamic in Perl 6
mfollett sorear: I didn't find what I was looking for in S11. Basically, I'm trying to fix Tags.pm but the fix is beyond me. Line 29 of it he is adding a bunch of subs into the module via ::Tags{$sub_name} = sub {} github.com/masak/web/blob/master/lib/Tags.pm 05:30
LaVolta rakudo: my @l = <a bb c d e f g h>; while @l.munch(3) -> $_ { .say } 05:36
p6eval rakudo 0421d3: OUTPUT«a bb c␤d e f␤g h␤»
LaVolta # perfect! 05:37
sorear mfollett: that's more like Parrot code than Perl 6 code 05:38
sorear thinks maybe packages shouldn't exist at all
sorear mfollett: pir::set_hll_global__vPSP(<Tags EXPORT DEFAULT>, $tag, sub { ... }); is probably the best you can get atm 05:41
the correct way is Tags::EXPORT::DEFAULT::{$tag} = sub { ... };, but Rakudo doesn't implement stash notation 05:42
mfollett sorear: Thanks! I was told it worked at some time in the past, I'm hoping I can get it working again. I'll look at that. Otherwise I was thinking I could change it into a class and use Tags.HOW.add_method(), but that'd probably change a lot of other things.
sorear: really, my other idea was a bad one. 05:45
moritz_ good morning 06:35
nymacro god morgen 06:36
sorear hello 06:47
sorear is still very confused by trying to implement GLOBAL 06:48
sorear or rather, I'm very confused by how GLOBAL correctly interacts with separate compilation 06:58
stuff like class Foo is Bar {} wants to see the unit's global, very very early
stuff like $GLOBAL::foo wants to see the true global, if run after BEGIN 06:59
any useful advise? 07:02
moritz_ populate it at BEGIN time 07:12
sorear maybe 07:13
that's what niecza/master does
er, wait
BEGIN
I'm trying to populate this at BEGIN, yes
moritz_
.oO( maybe we should rename BEGIN to ASAP :-)
07:14
sorear the basic problem is that use A::Foo; use A::Bar; needs to destructively merge GLOBAL<A/Foo.pm> and GLOBAL<A/Bar.pm>, but only for the scope of the one module
precompiled modules need to be immutable, for the whole precompiling thing to work, and mutable, for GLOBAL stuff to work out 07:15
moritz_ maybe GLOBAL is not that global after all
sorear there's some talk in S02 of one BEGIN-time GLOBAL per file 07:16
'use' merges GLOBALs from importee into importer, until at the start of CHECK time there is only the one GLOBAL
but... diamonds.
moritz_ are forever. 07:17
sorear if A uses B and C, and B and C use D, then I should get the same result whether B or C is compiled first
D's GLOBAL needs to be independantly and destructively merged into the GLOBALs of both B and C, which seems like a contradiction 07:18
lestrrat Where can one find a reasonably recent howto on writing Perl6 modules?
moritz_ aren't our-globals aliases fo reach other anyyway?
lestrrat: ttjjss.wordpress.com/2010/08/09/so-...-6-module/ 07:19
lestrrat moritz_: Thank you!
sorear moritz_: our is pretty easy 07:21
if I have : use Foo::Bar; class Foo::Baz is Foo::Bar { }
I'm augmenting Foo without monkeys, or something 07:22
and I need for the correct augmented Foo to be visible to all modules that use Foo
sorear (I need a RAM upgrade for this brain, it's thrashing crazy now) 07:23
sorear maybe I should make like Prolog and implement a unification algorithm that generates an undolog and can be reversed when entering a scope where it should never have happened 07:26
except that will completely screw up the multi-threaded compilation manager. sigh. 07:27
( moritz_ ? ) 07:29
sorear o/ colomon 07:33
colomon \o 07:33
mathw o/ 07:38
tadzik good morning 07:43
sorear is anyone still listening? 07:44
colomon ya 07:46
moritz_ has no further ideas for sorear 07:48
colomon oh, did I miss the key parts of the discussion? 07:57
colomon backlogs
dalek href="https://modules.perl6.org:">modules.perl6.org: 33276ef | moritz++ | web/index.tmpl:
link to module creation guide
07:58
tadzik oh yay. moritz_++ 07:59
moritz_ tadzik: when our module system evolves and things change, it would be nice to turn your blog post into a subpage on modules.perl6.org 08:09
tadzik moritz_: I just think whether to include some code-side tips 08:10
is there any docs about "is export is about exporting and our sub puts it in the modules namespace" besides synopses? 08:12
people tend to ask about this sometimes
moritz_ I don't know of any
tadzik maybe that's somethng for 5-to-6
moritz_ adds to his TODO list 08:13
masak oh hai, #perl6 08:30
tadzik oh hai
colomon \o 08:31
moritz_ o/
LaVolta \o/ 08:32
sorear hi masak 08:33
dalek kudo: f523366 | moritz++ | docs/ChangeLog:
[docs] update ChangeLog
08:47
masak [backlog] "ickle" as a variant of "little" sounds to me like something a parent would say to a small child. 09:00
sorear this is starting to make a bit of sense, if I eschew the concept of 'my' stashes and MONKEY_TYPING checks 09:16
why does augment package Foo { sub bar } need MONKEY_TYPING but sub Foo::bar does not?
moritz_ sub Foo::bar also needs MONKEY_TYPING 09:17
sorear what of class Foo::Bar?
quite a lot of rakudo modules start ... class Foo::Bar;
moritz_ you mean because it's augmenting class Foo?
moritz_ I think notionally Foo::Bar is not nested below Foo 09:18
sorear it's more like it's augmenting Foo.WHO
yeah
a large part of understanding niecza/mm has been rationalizing the difference between Foo and Foo::
moritz_ waits for the Foo.WTF macro
sorear: be sure to write that up somewhere 09:19
sorear in particular, I now see Foo as being a child of Foo::
rather than unrelated adjacent objects as they were in niecza/master
moritz_ let me get this straight... Foo:: is the symbol table, and Foo the type object? 09:20
sorear yes
moritz_ or ss/symbol table/stash/ if you prefer
good
sorear in particular, class Foo { ... } creates Foo:: but *not* Foo
moritz_ rakudo: ss/a/b/
p6eval rakudo 0421d3: OUTPUT«===SORRY!===␤Confused at line 22, near "ss/a/b/"␤»
moritz_ sorear: that makes a lot of sense
sorear but there's no way to do it the other way around
moritz_ sorear: and I guess class Foo::Bar { } creates Foo:: too? 09:21
sorear yes
sorear Foo::Bar is inside Foo::Bar:: which is inside Foo:: 09:21
moritz_ how do you go from Foo:: to Foo?
sorear I'm not sure yet 09:22
(well, $stash->obj :) )
moritz_ Foo::.type_object could work 09:23
but maybe it doesn't need API exposure at all
sorear recently deleted most of niecza's notes because they had fallen so far behind current thinking
moritz_: I'm not sure how much of niecza's metamodel is going to be exposed to the programmer 09:25
sorear Whole-program analysis doesn't work very well in a setting where the compiler is visible to itself 09:27
moritz_ then you can optimize the compiler in the same step as the program :-) 09:28
sorear so I'm seeing that the compiler's CORE is not the same as the user's CORE, no type aliasing exists
moritz_: the flip side of that is that I can't run global optimizations on the compiler early enough for them to matter 09:29
unless the program is running millions of evlas
Trashlord evlas 09:33
moritz_ elves 09:34
szbalint Legolas, what do your elf eyes see? 09:40
Action at a distance, of course! 09:41
moritz_ :-) 09:44
tadzik hah, I backlogged til my first day on #perl6 09:45
funny times :)
sorear my first day on #perl6 was in 2007 paying a house call to lambdabot
sorear which I maintained at the time 09:45
I don't think I even knew Perl 5 back then
tadzik well, mine is 13 of June this year. My first sentences were reporting a bug :) 09:46
moritz_ mine were reporting a broken link on the pugscode web page
I got a commit bit that day :-)
sorear Perl people are nice like that. 09:47
masak does rt.perl.org/rt3/Ticket/Display.html?id=78068 mean that the REPL is not yet using the "infinitely nested blocks" idea by TimToady? 09:58
sorear masak: infinitely nested blocks were my idea, and I used them in my patch 09:59
masak oops. thanks for the correction. 10:00
sorear masak: pmichaud++ came up with an alternative implementation, which was sligtly less elegant but had the advantage of not leaking memory
masak ah.
...and it doesn't handle contextuals?
moritz_ seems it has a disadvantage too :-)
sorear in pmichaud's REPL, there is a single outer block, which has a custom LexPad instance that is backed by a hash
after every line, lexicals are copied from the inner to the otuer block
moritz_ wikis.sun.com/display/mlvm/HotSwap might be of interest 10:15
sorear that list is ludicrously ambitious 10:21
unless they are taking it for granted that most of the interesting optimizations, like oh inlining final methods, will never happen 10:32
re-optimizing functions with existing call frames is... hard 10:33
sorear unless your compiler has a very disciplined approach to spills and caller-saved registers 10:33
I'm talking about Appelian CPS stuff here 10:34
jnthn o/ #perl6 10:52
sorear hey jnthn 10:54
how's the nom?
jnthn Breakfast was nice, and lunch was even nicer. :-)
Soon time to get back to work again :-)
sorear The other nom :-) 10:55
jnthn Oh! 10:56
That nom now supports attributes. :-)
I plan to start getting a ClassHOW sketched out in NQP soon.
Well, already started. But I mean one that akshually runs. :-) 10:57
sorear thinks he's finally figured out how to make global merging work
jnthn Yay. :-) That sounds...tricky.
sorear (perhaps you forgot to load "Mu"?) # my perl 5 is having an identity crisis 10:58
I'd be interested to know how you're handling it in nom
sorear How do you deal with separate compilation of modules in the face of Parrot's single root namespace? 11:00
jnthn pmichaud++ and I discussed this a little at YAPC::EU nad felt we'd have to move away from using Parrot's namespace mechanism at some point. 11:02
(due to this kinda problem)
sorear I hope I can help you with your replacement 11:04
jnthn I hope so too :-) 11:08
I think it'll be a refactor after the one to get the new meta-model bits in place.
We don't want to bite off too much in one go.
Don't think the Rakudo user base could handle another alpha -> ng style thing, so smaller jumps are kinda preferable. 11:09
sorear tadzik had some code earlier like ::Foo{$name} = sub { } 11:11
I don't want to think about how that ever could have worked
tadzik sorear: ? 11:14
sorear jnthn: Do you see much prospect for object attributes without containers? 11:17
sorear I don't really like that has $.foo is 1 word for the pointer, then 6 more for the container... but I don't see a good improvement without totally breaking &infix:<=> 11:17
(I can cut containers to 4 words with a bunch of representation hacks, but it's not enough of a measured win to be worth all the ugly) 11:19
jnthn sorear: Tied up with that is what assignemnt to a my int @foo; actually means. 11:21
Since that is meant to be a compact array.
sorear Yes 11:22
I had a minor breakthrough last night; decontainerization and unboxing make a lot more sense if considered in isolation 11:23
I can very easily make an UnboxedContainer<T> type, which allows "my int $foo" to take up only 4 words with no Int object in sight and no loss of semantics 11:24
jnthn I'd certainly seen those as orthogocal, yes. 11:25
sorear UnboxedContainer doesn't have to worry about the scalar flag or autovivifaction, which is what allows it to be 4 easily instead of 6
sorear the flip side is that decontainerized boxed values would be awesome 11:26
(current niecza memory stuff: objects - 7+#slots words; containers - 6 words; Int - 12 words, because slots are Object and so I need a boxed System.Int32 *grr*) 11:27
moritz_ does t/spec/S09-typed-arrays/arrays.rakudo loop for anybody else? 11:30
sorear out 11:36
dalek ecza/mm: 2d62a5a | sorear++ | / (2 files):
[mm] implement ENTER time, a double fault handler
11:39
ecza/mm: e5ac4b6 | sorear++ | src/ (2 files):
[mm] Rethink stash handling
masak hm. I don't think this has any bearing on Perl 6's Pod. or does it? apple.slashdot.org/story/10/09/26/2...-Trademark 11:57
flussence I doubt they're desperate enough to sue over *that* 11:58
masak yeah, probably. 11:59
[Coke] moritz_: I wonder, would it be possible to show bot responses in a more subdued style on the irc logs? 12:21
(would make skimming faster. ;) 12:22
PhatEddy Hey - the rakudo README still lists the smolder reports as being at plusthree.org. Can someone here fix or do I need to open a ticket? 12:39
masak PhatEddy: feel free to submit a ticket. 12:44
PhatEddy OK - thx 12:46
dalek kudo: 607ec45 | moritz++ | README:
[README] fix smolder link, PhatEddy++
13:17
masak TimToady: happy birthday! \o/ 13:31
xinming_ TimToady: happy birthday. :-) 13:32
moritz_ TimToady++, erm, TimToady.age++
gabiruh TimToady: the cake is lie! 13:36
masak oh, and thanks for Perl. it makes both my work programming and my hobby programming more joyful. 13:37
(or is it "they" nowadays?)
moritz_ if you refer to the language family, 'it' is fine :-) 13:38
masak the reminds me of a certain distinction involving sigils... :P 13:39
moritz_ :-) 13:40
masak there's $Perl, the language family, and there's @Perl, the languages. 13:47
colomon TimToady: happy birthday!
masak お誕生日おめでとう! ^^ 13:48
jnthn TimToady: Happy birthday! Thanks for a great language and the most fun implementation tormentation of my life. :-) 13:49
masak jnthn: masochist! :)
jnthn masak: masakist! :) 13:51
masak acme: acmeist! 13:52
moritz_ athe: ist! 13:53
masak :) 13:53
mathw istist! 13:55
mathw TimToady: Happy birthday! Thanks for this exciting journey of language design and implementation! 13:56
masak I know we keep saying that Perl 6 development is unprecedented as an open, democratic process of language design. but there are probably other languages that have taken a similar path. what about Haskell, for example? 13:57
mathw Haskell is pretty open 13:58
I remember when they were inviting people to weigh in on Haskell Prime
But they aren't as open as Perl 6
masak right. a bit more committee-y. 13:59
mathw Yeah
masak guess Algol 68 was pretty committee-y, too.
mathw but the committee is pretty much open to anybody with a bit of a track record in that kind of research
so it's open within the field, as it were
very academic approach :)
mathw and they do produce a good language so I'm not going to complain 14:00
masak I think many people who brush by the Perl 6 community and #perl6 don't realize how open the process actually is.
simply because there are not much else to compare against.
mathw yeah
and also because some of the discussions get pretty esoteric
But that's just because people have familiarity 14:01
gottreu is surprised no one has told him to hush.
mathw Anybody who learns what we're talking about and gets involved is welcome at any level
which is awesome
masak gottreu: there's plenty of room in the IRC logs :) we're trusting you not to misuse it :P
tadzik everyone can contribute, whatever the level of Satori, which is awesome 14:02
masak tadzik: I like that. use it in a blog post title :) 14:04
tadzik about contributing?
masak here's a good summary of the evolution of Haskell, by the way: research.microsoft.com/en-us/um/peo...istory.pdf -- basically, Haskell evolved first through a number of physical meetings, and then over email. 14:07
tadzik I like the word "meatspace" 14:08
mkramer kill it with fire 14:09
we must not let that word catch on
colomon mkramer: ~393,000 hits for "meatspace" in Google, I think it's a little late to kill it. :) 14:11
moritz_ mkramer: what would you use instead? 14:12
mkramer space?
masak 'meatspace' is a fine derogatory terms for those already entrenched in other spaces. I like how it pretends to put the physical world on equal terms with all the other, less palpable ones.
moritz_ well, having "meetings in space" sounds a bit different to me... 14:13
masak tadzik: sorear was referring to the trick used to make Tags.pm work. mfollett++ has been looking at that code recently too. 14:14
tadzik Tags.pm?
masak tadzik: yes, it's in the Web.pm repo.
tadzik I feel like that wasn't me
mkramer besides, when we become robots, meatspace isn't going to work
meat is an implementation detail
masak tadzik: then maybe sorear confused you with mfollett.
tadzik wait, I haven't touched Web ever since
masak mkramer: lol! 14:15
tadzik I don't feel like messing with my Covers Role
it has bugs, but hell, it has like few tousand years of testing 14:16
so at least you know the bugs
not to mention it's extremely flexible 14:18
mfollett rakudo: class A { has Int $.foo }; my $a = A.new( foo => 'a string'); $a.perl.say # This seems like a bug, is it and is it already reported on? 14:20
p6eval rakudo f52336: OUTPUT«A.new(foo => "a string")␤»
tadzik I think it's known 14:21
moritz_ it's reported, yes
tadzik rakudo: class A { has Int $.foo }; my $a = A.new; $a.foo = "asd"
p6eval rakudo f52336: OUTPUT«Cannot modify readonly value␤ in '&infix:<=>' at line 1␤ in main program body at line 22:/tmp/4oZEiwaegQ␤»
tadzik rakudo: class A { has Int $.foo is rw }; my $a = A.new; $a.foo = "asd"
p6eval rakudo f52336: ( no output )
mkramer heh heh
tadzik rakudo: class A { has Int $.foo is rw } my $a = A.new; $a.foo = "asd"
p6eval rakudo f52336: OUTPUT«===SORRY!===␤Confused at line 22, near "class A { "␤»
moritz_ but since jnthn++ is about to redo classes and attributes anyway, there's not much point in investing too much time fixing it right now
tadzik hmm. colon is obligatory?
masak mfollett: yes, it's known. 14:22
moritz_ semicolon, yes
tadzik semicolon, right. Hmm, I remember something related in the book recently
moritz_ tadzik: it's only optional for }\n
masak tadzik: that's a big syntactic difference from Perl 5.
tadzik ah, I see 14:23
masak tadzik: statement-ending closing brace, and then always \n or ; (or both)
tadzik: it's part of TTIAR
tadzik TTIAR?
moritz_ aloha: TTIAR?
masak Two Terms In A Row.
moritz_ two terms in a row 14:24
masak Perl 6 tries hard to stay away from TTIAR.
masak in fact (as TimToady often points out), it uses TTIAR conditions to give better error messages. 14:24
some of the best error messages are actually "promoted" TTIAR errors. 14:25
masak s/it/STD.pm6/ 14:30
moritz_ the IRC logs now show a tooltip help for TTIAR
masak moritz_++
moritz_ (at least for today and the future; older pages might be taken from the cache 14:31
and I don't feel like invalidating 180M cache just for one abbreviation 14:32
masak that just means that you're not insane.
moritz_++
it's a relatively recently trending FLA anyway :P 14:33
moritz_ the logs don't know about TLA or FLA yet :-) 14:34
masak keep in mind that FLA is ambiguous.
also, I wouldn't say that it's trending; not like TLA, anyway :)
moritz_ right; I'm adding only TLA now
masak oh my, TLA is ambiguous too. but no-one means 'two' when they say it, so that's probably OK. 14:35
moritz_ or "ten" :-)
gottreu Does Perl have the longest A in actual usage with its NLA? 14:36
masak and OLA feels like a degenerate concept, even if C, D, R and others would qualify.
tadzik TLA is LTA imho
masak tadzik: like them or not, the computer industry seems to focus on them. I think there's some healthy chunking effect going on. 14:42
moritz_ rakudo: say 26**3 14:43
p6eval rakudo f52336: OUTPUT«17576␤»
moritz_ that's decent room for now :-)
mfollett thanks all 14:45
pmichaud good morning, #perl6 15:02
colomon o/ 15:03
ZadYree rakudo: $foo = ("bar", "baz"); say $foo[0];
moritz_ \o 15:04
tadzik R* today? 15:04
pmichaud tomorrow
tadzik hello pmichaud
p6eval rakudo f52336: OUTPUT«(timeout)»
moritz_ tadzik: did you integrate neutro with star yet?
tadzik pmichaud: how about adding neutro as a module manager? It works well on Linux and OSX, still hasn't been tested with Windows
moritz_: #define integrate
moritz_ tadzik: added it to the star repo, so it's available after installation 15:05
tadzik nah, still waiting for everyone's decision
that would require adding a bunch of other modules too
moritz_ ask for forgiveness rather than permission!
tadzik afair there is proto there now, 2 module managers would be confusing, especially if only one works 15:06
moritz_ tadzik: do you have commit access to star?
tadzik moritz_: yep
moritz_: I tend to be more polite when it comes to Star, it's a big thing
alright, I'm messing up then
are modules built in order? 15:07
moritz_ yes
mfollett Is proto getting removed from this Star also?
moritz_ if it doesn't work right now, I'd remove it 15:08
tadzik I think so
moritz_ it can be added later on when it works
mfollett I agree, I was just curious. 15:08
tadzik that means File::Tools and Module::Tools also come 15:09
they're all built using ufo?
tadzik I volunteer for some testing, as long as it's tomorrow AM UTC 15:12
TimToady rakudo: say 42.so 15:15
p6eval rakudo 607ec4: OUTPUT«Bool::True␤»
TimToady rakudo: say 42.not
p6eval rakudo 607ec4: OUTPUT«Method 'not' not found for invocant of class 'Int'␤ in main program body at line 22:/tmp/GodIxJNpLn␤»
tadzik /tmp/GodIxJNpLn 15:16
dalek ar: 2136cf6 | tadzik++ | / (2 files):
Modules mashup

removed proto, changed File::Find to File::Tools, added Module::Tools, added neutro
tadzik I wonder what is the message 15:16
diakopter phenny: tell TimToady happy 35:36 15:17
phenny diakopter: I'll pass that on when TimToady is around.
TimToady feels incremented
phenny TimToady: 15:17Z <diakopter> tell TimToady happy 35:36
tadzik TimToady: happy birthday!
and may the christmas come even earlier
diakopter you know what they say, things that are appreciated must eventually be depreciated. :) 15:19
TimToady they also say that anything that goes up must come down, but they're wrong about that... 15:19
tadzik is thinking about a Camelia sticker for his laptop 15:21
ash_ the only sticker i have on my laptop is from Google Summer of Code 15:22
tadzik is there any hi-res (svg?) Rakudo logo somewhere? 15:25
pmichaud tadzik: looking 15:28
pmichaud I have it as an Illustrator file 15:29
tadzik what is it? 15:30
pmichaud I think I can export it as svg, but I'll need to reinstall illustrator 15:31
doing that now
tadzik png will do too
pmichaud pmichaud.com/sandbox/rakudo-box-3000.png 15:33
(had that one already available :-)
tadzik awesome! pmichaud++
I will carry Perl 6 propaganda everywhere I go :) 15:34
tadzik I wonder what would it look like, if I placed Camelia to have a Thinkpad LED inside her eye 15:35
Grimnir_ has laziness been implemented in the current version of Rakudo? 16:14
moritz_ to a large degree, yes 16:15
TimToady rakudo; say (1..*).map({ $_ * $_ }).munch(10).Str 16:16
masak rakudo: say .[0], .[1] for gather { take 1; say "OH HAI"; take 2; take 3 } }
p6eval rakudo 607ec4: OUTPUT«===SORRY!===␤Confused at line 22, near "}"␤» 16:17
TimToady rakudo: say (1..*).map({ $_ * $_ }).munch(10).Str
p6eval rakudo 607ec4: OUTPUT«1 4 9 16 25 36 49 64 81 100␤»
masak rakudo: say .[0], .[1] for gather { take 1; say "OH HAI"; take 2; take 3 }
p6eval rakudo 607ec4: OUTPUT«1OH HAI␤23»
Grimnir_ rakudo (0,2 ... *).fmt("%s", ", ").say
masak huh? 23? 16:18
Grimnir_: that would hang.
Grimnir_ ok
masak Grimnir_: since .fmt on a list gobbles up the whole list.
Grimnir_ ah, ok
masak laziness is nice, but it's not a panacea. :)
Grimnir_ hehe, right :)
rakudo my @crap = 0,2 ... *; 16:19
pmichaud that currently hangs also
TimToady that is also eager
use :=
Grimnir_ := ? what does that do?
TimToady does binding instead of assignment with copy
Grimnir_ btw, totally nice feature with the ... thing. 1,2,4 ... * doubles every time? very nice 16:20
TimToady more or less means "define this as"
Grimnir_ so := would make it lazy?
rakudo: my @crap := 0,2 ...*;
pmichaud := avoids the eager assignment
TimToady it doesn't make it eager
p6eval rakudo 607ec4: ( no output )
pmichaud TimToady: do we eventually want assignment to detect the infiniteness of the series there? 16:20
TimToady laziness is not a positive virtue in that sense 16:21
Grimnir_ rakudo: (0,2 ...*).WHAT.say
TimToady pmichaud: that would be nice
p6eval rakudo 607ec4: OUTPUT«List()␤»
Grimnir_ how do I get number of elements in a list in the object oriented way? 16:22
I mean, @crap.length-ish
pmichaud .elems
Grimnir_ ah, thax
TimToady rakudo: (1,2,4 ... *)[20].say 16:23
p6eval rakudo 607ec4: OUTPUT«1048576␤»
masak rakudo: say (1, 2, 4 ... *).elems
p6eval rakudo 607ec4: OUTPUT«(timeout)»
TimToady .elems is stupid right now
Grimnir_ ok, so it will make the list when I want to see how many elements there is. I thought it might give me the result as Inf ;)
pmichaud it's not always stupid :)
rakudo: say (1..*).elems
p6eval rakudo 607ec4: OUTPUT«Inf␤» 16:24
TimToady yes, well, that's not a list :)
pmichaud rakudo: say (1..*).list.elems
p6eval rakudo 607ec4: OUTPUT«Inf␤»
pmichaud :-P
Grimnir_ wow
TimToady how does it mark it?
pmichaud iterators can be told that they're infinite 16:25
I forget the exact mechanism atm
TimToady well, someone needs to tell ... *
pmichaud right now, only ranges understand infinity
Grimnir_ rakudo: my @crap := (1,2,4 ... *); @crap.elems.say
pmichaud but yes, we can extend that to work for series ending in * 16:26
p6eval rakudo 607ec4: OUTPUT«(timeout)»
Grimnir_ ok, so a list doesn't?
TimToady a list doesn't what?
moritz_ s/series/sequence/ please :-)
Grimnir_ TimToady: understand infinity?
TimToady it does, but not consistently yet
it only understands it if told 16:27
since lists are agnostic about what generates them
Grimnir_ how does the "1,2,4 ... *" work? how does it know how to extrapolate?
TimToady: what does that mean? how can I tell a list to know about it?
TimToady read S03:1752
moritz_ by inspecting the first three elements, of course :-)
Grimnir_ moritz_: right ;)
mkramer rakudo: say (1,2,4 ... * )[112] 16:28
p6eval rakudo 607ec4: OUTPUT«5.19229685853483e+33␤»
Grimnir_ but how well does it do it? Can't help of thinking about those intelligence tests with a sequence, and you have to find out what the last one is :) 16:28
masak swim &
moritz_ 18:27 < TimToady> read S03:1752 16:29
mkramer Grimnir_: It's specced out in S03. It doesn't work for all sequences
supernovus g'day #perl6
phenny supernovus: 26 Sep 21:28Z <tadzik> tell supernovus we could put them in File::Tools and then Module::Install would make use of 'em, it depends on File::Tools anyway
Grimnir_ ok, i'm kind of n00b here. how do I find S03?
colomon Grimnir_: it checks to see if it is arithmetic or geometric sequence, that's all
pmichaud Grimnir_: perl6.org, click on "Synopses" 16:30
TimToady do you know where the irclog is? that link is automatically generated there
pmichaud er, "Synopsis"
Grimnir_ thx
TimToady see the end of irclog.perlgeek.de/perl6/today
moritz_ or shorter irc.perl6.org/ # redirects there, diakopter++
supernovus phenny: tell tadzik That sounds good. I tried writing a 'ww6' script without resources. It was a bunch of $file.say: '#!/usr/bin/env perl'; type lines, and was hideous. 16:37
phenny supernovus: I'll pass that on when tadzik is around.
pmichaud > say (1,2,4).elems 17:07
3
> say (1,2,4,*).elems
Inf
colomon \o/
pmichaud TimToady: does ^^^ look right to you?
colomon oh, wait... is that actually correct in the general case? 17:09
pmichaud "general case"? 17:10
colomon I thought the ,* extension feature was a special rule for one of the metaops. 17:11
"For any kind of zip or dwimmy hyper operator, any list ending with * is assumed to be infinitely extensible by taking its final element and replicating it"
which kind of implies it's not true elsewhere. 17:12
pmichaud well, the ,* in this case doesn't imply "repeat final element"
colomon what does it imply, then? 17:13
pmichaud that the parcel has infinite length
PerlJam That seems like an odd declarative mechanism. 17:14
colomon so if you said (1, 2, 4, *).munch(10), what would you get? 17:15
flussence Method 'munch' not found for invocant of class 'Parcel'
PerlJam heh
flussence .Str doesn't try to return an infinite list, thankfully... 17:16
colomon fair enough
flussence: ~ might in the future. ;)
pmichaud colomon: well, this is all speculative at the moment (more) 17:18
at one point, TimToady++ speculated that ,* would act like * xx Inf
so I would guess that .munch(10) would result in (1,2,4,*,*,*,*,*,*,*)
PerlJam pmichaud: so it *does* imply "repeat final element"! 17:19
:-)
pmichaud PerlJam: I don't know what it should do, I'm only reacting to suggestions :)
flussence hm... an infinite list used in non-lazy context should probably return Failure instead of trying to return a list...
pmichaud flussence: that's already specced. 17:20
flussence ok
huf what if it doesnt know it's infinite until it is?
pmichaud that's the issue. How does one indicate that a gather/take loop is "infinite"? 17:21
flussence for that we'd need "return $list if $list.halts", which probably won't be implemented :)
colomon gather(:infinite) ?
pmichaud it's been speculated that the generic "make this thing infinite" marker is to add ,*
as in (gather ...),* 17:22
flussence
.oO( at least, not in a generic way... )
pmichaud afk, bbi15
colomon pmichaud: seems to me like it might be useful to allow signaling both ways? ie "I know this gather is finite" and "I know this gather is infinite". (vs "I have no cool about this gather.") 17:25
or does ,* indicate "this gather might be infinite"?
ash_ is there a perl6 version of AUTOLOAD speced yet? 17:26
i noticed it was changed in the spec, i didn't see it
pmichaud colomon: ,* indicates "this construct is infinite" 17:53
mkramer ash_: you saw it in the spec, but you're wondering if it's specced? :) 17:56
pmichaud afk, lunch 18:07
jnthn evening, folks 19:04
sjohnson hi!
masak hi, jnthn 19:05
jnthn o/ masak
hi sjohnson!
sjohnson y0
perl6 fact of the day: the .= to run a function on itself as a variable is a breakthru in quick-programming 19:06
masak sjohnson: please explain.
masak sjohnson: it's intriguing that this is a "fact of the day". :) will you be back tomorrow with a new fact? 19:07
sjohnson you bet!
masak sjohnson: do you have an example of where .= with a variable is especially good? 19:09
sjohnson rakudo: my $text = " imagine this text grabbed from a HTML form "; $text .= trim; say $text 19:10
p6eval rakudo 607ec4: OUTPUT«imagine this text grabbed from a HTML form␤»
sjohnson ... oh joyous day
masak oh, that one. yes, indeed.
mfollett I couldn't find it in the spec, will it eventually be the case that you could use a where clause on an attribute declaration in a class? 19:11
masak even 'my TypeWithLongishName $foo .= new'
mfollett: yes, it will.
mfollett: the question remains (I think) whether the type will then need parens.
sorear good * #perl6
sjohnson masak: it's definitely nice when you are stuck with the variable already for whatever reason, and don't have to write: $var = trim($var); as in PHP 19:12
i was reminded of this cause i did some PHP today
masak sjohnson: also, have you seen the trick for using a sub as a method on _any_ object? 19:13
rakudo: sub foo { $^a ~ " HAI" }; say "OH".&foo 19:14
p6eval rakudo 607ec4: OUTPUT«OH HAI␤»
sjohnson yeah 19:15
i think you did that trick on the rot13 question i had, or maybe you used something else
that behaved similarily
i remember you doing something like "hi there!".$foo instead of &
but maybe my mind is playing tricks on me.
mfollett sjohnson: it appears you don't need the '&', at least not currently 19:27
rakudo: my $hello = "Hello, " ~ *; "World".$hello.say
p6eval rakudo 607ec4: OUTPUT«Hello, World␤»
sjohnson i need to learn how those * things work 19:29
mkramer the thing about * is that it's many different things
mfollett In that context * just makes an anonymous subroutine so that you can evaluate the expression with a value later on.
moritz_ there are basically just two uses of the term *
one is for currying 19:30
mkramer it's alternatively a Whatever object, the multiply operator, a special syntactic construct that turns an expression into a closure
mfollett So, "Hello, " ~ * is equivalent to sub { "Hello, " ~ $^a }
moritz_ and the other is a just a literal Whatever
and the called routine decides what to do with it
mkramer and exponentiation as well 19:31
moritz_ that's not the term *
that's an infix operator containing a *
mkramer Oh, I thought we were talking about those * things 19:32
not the term *
mfollett sjohnson: At the risk of being to self-promotional I wrote up some notes on what * does here: mfollett.com/perl-6-whatever 19:33
sjohnson thanks 19:34
masak mfollett++
mfollett thanks 19:36
masak mfollett: please keep writing those. 19:38
mfollett masak: I'm trying :) 19:39
mkramer rakudo: for ^9 do say * * * ** * 19:41
p6eval rakudo 607ec4: OUTPUT«===SORRY!===␤Missing block at line 22, near "do say * *"␤»
mkramer rakudo: for ^9 { say * * * ** * }
p6eval rakudo 607ec4: OUTPUT«===SORRY!===␤set_number_native() not implemented in class 'Num'␤»
florz mfollett: you are aware that your document contains parts that are tried to be constructed dynamically? 19:46
alester mfollett: There's no such thing as too self-promotioanl. 19:49
As long as it's useful, it's irrelevant if it's you promoting it or some other party.
The geek tendency toward false modesty is bullshit. 19:50
Be proud of what you've done!
pmichaud jnthn: o/ 19:51
sjohnson pats perl6 people on the back
jnthn pmichaud: oh hai :-) 19:52
pmichaud: How's things?
pmichaud reasonably well
jnthn :-)
pmichaud: It'd be good to catch you at some point (now isn't good for me though) to discuss some bits about my grant, and how to plan some icky migration-y issues I'm about to hit. 19:54
pmichaud now isn't good for me either. tomorrow and/or wed should be better
jnthn Well, "about to" means "in a week or two" rather than "in a day or two" :-)
pmichaud oh
jnthn But it'd be good to deal with 'em up front.
When I hit them they'll be pretty hard blockers, probably. 19:55
dalek odel: c0c6232 | mberends++ | / (3 files):
[java] catch up to dotnet in runtime/ but not in compiler/
jnthn Essentially things like "I'll want to switch class in NQP to use new meta-model classes, but then I'll break the NQP build/bootstrap because actions classes will want to inherit from PCT::Actions, but that's in the Parrot repo so what to do?" 19:56
jnthn er. if PCT::Actions exists. :-) 19:56
jnthn checks
I just worry *something* I'll need to switch is going to be outside the nqp-rx repo. 19:57
sorear PCT::Node switching to 6model would be an unspeakably huge win 19:57
jnthn oh, I know something is. PCT::Compiler.
sorear: Yeah, I won't block on that.
sorear: But I fully agree and want it to happen too.
sorear it would probably cut rakudo build memory usage by 80-95% 19:57
pmichaud you're over-worrying :)
jnthn Optimism. sorear has it. :-)
pmichaud the only thing that inherits from PCT:: (afaik) are PCT::Node and PCT::HLLCompiler 19:58
jnthn pmichaud: I'm not so much worried it's un-doable, I'm just keen that we work out an approach. :-)
pmichaud and PCT::HLLCompiler probably can be entirely re-written in NQP
jnthn Aha
pmichaud sorear++ did a lot of it already :) 19:59
mfollett florz: what do you mean?
jnthn sorear++ :-)
pmichaud and tbh, not a lot should depend heavily on p6object -- since what p6object attempts to provide is an API
jnthn Right, and add_method etc will live on.
pmichaud as long as the new model provides type objects, then everything else ought to be reasonably okay
jnthn Yes, it (deeply) provides type objects. :-)
florz mfollett: I mean the fact that my browser displays something like this: 20:00
You would find $foo holds something like:
pmichaud anyway, I'm not to worried about breaking the build/bootstrap
florz Which you could then use like this:
pmichaud I suspect bootstrapping this time around could be far easier than it was the first time around 20:00
jnthn Well, it's all in a branch anyway
I will want to bootstrap in order to do the gradual typing-y and serialization-y bits
pmichaud also, I'd suggest not worrying about doing the full bootstrap cycle yet
jnthn But that's phase 2. :-)
Well, I want to bootstrap at the end of phase 1 again 20:01
pmichaud sure
jnthn But yes, I'm fine with breaking it for a while.
pmichaud but the primary thing to focus on is getting an nqp that uses the new model
jnthn Actually being able to do so again will probably be what tells me I'm done with phase 1 in the roadmap I blogged. :-)
OK.
pmichaud once we have that, I can certainly help with completing the bootstrap cycle
moritz_ std: ss/a/b/
p6eval std : OUTPUT«ok 00:01 116m␤»
pmichaud i.e., for a short period of time, I'd expect we have nqp and nqp-newmodel 20:02
jnthn nqp-rx in nom now supports knowhow decls with attribute and method declarations.
(nom = branch name :-))
pmichaud oh, yeah, knowhow might be a bit of an issue for existing nqp-rx
jnthn It's additive.
pmichaud anyway, making *that* conversion isn't something that worries me much
jnthn *nod*
pmichaud I'm more concerned about the effort needed to migrate rakudo 20:02
jnthn It may be that we have two NQPs going into Parrot.
For a little bit.
jnthn We'll see. 20:03
mfollett florz: Yeah, I put all my code examples as gists on github because Posterous doesn't support syntax highlighting on any version of Perl whereas at least github's gists will do syntax highlighting for Perl 5. 20:03
jnthn Yes, migrating Rakudo will be...effort.
jnthn I did at least hide most stuff behind a meta-model API that won't be changing crazily. 20:03
pmichaud anyway, when did you want to meet to discuss?
pmichaud this week, next week, two weeks? 20:03
jnthn Tomorrow evening is *in theory* OK.
florz mfollett: which effectively makes the document unreadable - that sounds much more sensible than lacking syntax highlighting indeed
jnthn Well, I'm keen to have the discussion earlier rather than later. 20:04
pmichaud okay, this week then.
any idea how long?
jnthn Because it may well influence my priorities from here on in.
pmichaud #phasers is at 19h00
jnthn I mostly want to run by you what I've got so far to make sure it sounds sane, and discuss migration planning.
pmichaud I have kid pickup at 19h45
jnthn We could take it after #phasers, if that works at all for you.
Ah, OK
After kid pickup?
I don't see us needing longer than an hour. 20:05
pmichaud 20h00 works for me, but around 21h00 I'll probably have to help with kid hw
oh, maybe not if Paula sticks around home tomorrow (as she's currently planning to do)
sjohnson kid hw probably pretty easy for a perl6 dev!
pmichaud anyway, let's tentatively say 20h00 utc tomorrow
jnthn #phasers is...21h00 my time.
sjohnson :-)
pmichaud if it doesn't work out, we'll find a time on wed
(all times quoted by me are utc :-) 20:06
jnthn So 22h00 utc is like 1am here. And I have to be at $dayjob at 9am the next day...
Yeah...I think that will probably make me exhausted the next day. :(
OK, maybe Wed is better.
pmichaud 20h00 is 22h00 for you which is 10p, right?
jnthn Oh, sorry 20:07
pmichaud 20h00 utc is 22h00 localtime for you, yes?
jnthn You wrote 20h00 and I read it as 22h00
Is it 20h00 UTC now?
pmichaud yes
pmichaud 20h07 20:07
jnthn It's 22h07 here at the moemnt
So yes
:-)
OK, then that is fine.
20h00
Tomorrow.
jnthn :-) 20:07
pmichaud will plan for then 20:08
oh, also tomorrow I have R* release to cut
jnthn
.oO( I hope I'm better at meta-models than I am at timezones... )
pmichaud hmmmm
let's stick with 20h00 utc for now.
if I'm running behind or have other things come up we'll resched for Wed
jnthn OK, that's fine. 20:09
jnthn $dayjob has shifted my waking hours a little earlier at the moment. :-) 20:09
pmichaud it looks like I'll have a steady $dayjob for a few months again, as well :)
moritz_ is that good or bad? :-) 20:10
pmichaud financially, it's very good. 20:10
moritz_ congratulations then
sorear thinks about implementing Moose-style accessors 20:11
jnthn pmichaud: Nice :-)
pmichaud The last couple of months I've had to dig into my savings a bit more than I'd like, this will help replenish/avoid that. 20:11
jnthn pmichaud: Hope it's fun as well as money.
pmichaud fun... not quite so much. :-|
jnthn Or at least not un-fun.
Aww.
pmichaud but it's not totally un-fun, either.
sorear has $.foo is moosely; say $.foo; $.foo(3) # saves 24 bytes per instance over perl6ly accessors 20:13
sbp or, is moosesome 20:14
pmichaud is moosed
is moosey
rjbs Mooschaud.
pmichaud has antlers 20:14
sbp elkic 20:15
sorear (Would somebody remind me why System.Object has a mandatory mutex? 1 word per GCable is "paying through the nose" in my book) 20:16
diakopter sorear: but remember value types don't count, since they're always stack allocated only, or embedded in other reference types 20:36
like value_type[] 20:37
and value types are "said" to derive from System.Object .... 20:38
but really only at compile time, unless they're going to be boxed. really, a boxed value type is a different type 20:39
sorear diakopter: value types aren't gcables 20:41
so my statement doesn't apply to them
diakopter right, just clarifying. 20:42
... because the value types are "said" to derive from System.Object 20:43
Grimnir_ I can't get ff (flipflop) to work 21:14
I have a silly one-liner just to test it, but it doesn't work: perl6 -e 'use v6; for $*IN.lines { if /__START__/ ff /__STOP__/ { if (/^^\d+$$/) { say "Numbers"; } elsif (/^^\w+$$/) { say "Letters"; } else { say "Nothing important"; } } else { say "..."; } }' 21:15
btw, does the "use v6" actually do anything?
flussence on the command line, not really
moritz_ ff is NYI 21:16
sorear use v6; does nothing if encountered by a Perl 6 compiler
moritz_ Grimnir_: it gives a proper error message when you accidentally run the file with perl 5 21:17
Grimnir_ ah, ok
right
is .pl still the right name?
moritz_ yes
sorear In a hypothetical future world where Rakudo can emulate Perl 5, 'use v6' will switch that off 21:18
flussence uses .p6, but only because vim's not smart enough to load the right syntax when it sees "v6" at the top...
sorear but it's not the only way to do that; the 'class' and 'module' keywords also force v6, as does a .pm6 file extension
Grimnir_ flussence: that/s exactly the thing
sorear at one point package NAME BLOCK was also specced to trigger v6 21:19
but that syntax has been added to Perl5 recently
Grimnir_ flussence: is it because vim can't handle it, or is it because no body has made a proper vim plugin yet?
perigrin sorear: MX::Declare kinda horks the class {} trigger 21:20
flussence I dunno if it's a limitation of vim, I've seen it do similar things for .sh though. 21:21
sorear perigrin: feeding Devel::Declare sources to poniedo is going to end in tears
perigrin poniedo?
Grimnir_ strange cats... now they are eating potato 21:22
moritz_ perigrin: you still have to use a syntax manipulating module to be able to write class MyClass { }
perigrin moritz_: yes
sorear The hypothetical Rakudo Perl 5 emulator
perigrin sorear: ahh
sorear Which doesn't have a name yet, so I just made one up
Let's see if it catches on
perigrin I suspect anything depending on XS on poniedo is gonna lead to tears. 21:23
flussence oh, vim does content-sniffing in filetype.vim for .sh 21:24
sorear I blame SvREFCNT_inc
Grimnir_ ok, that's a pretty darn big vim-file 21:29
tadzik hello 21:35
phenny tadzik: 16:37Z <supernovus> tell tadzik That sounds good. I tried writing a 'ww6' script without resources. It was a bunch of $file.say: '#!/usr/bin/env perl'; type lines, and was hideous.
dalek ecza/mm: 8e30bea | sorear++ | src/ (2 files):
[mm] Avoid directly referencing packageoids

Using the crossref table like this should make freeze/thaw work a lot better.
21:36
ecza/mm: 924e9b8 | sorear++ | src/Metamodel.pm:
[mm] and apply the same treatment to StaticSub
ecza/mm: 383ed07 | sorear++ | src/ (4 files):
[mm] start metamodel hackery for settings
cosimo moritz_: please can you add github.com/cosimo/perl6-cache-memcached to the list of projects on modules.perl6.org? thanks 22:14
diakopter use v6; # makes a Perl 6 compiler move from its default (Perl 5 mode) to Perl 6 mode, I thought. 22:17
oh
sorear A Perl 6 compiler should default to Perl 5 mode if an only if it is installed as "perl" 22:18
diakopter seems reasonable 22:20
thowe I'm rediscovering my love for the Camel book. 22:35
I've had this thing for about 9 years and have just started reading it again. I was so re-impressed that I wrote an Amazon review for it. 22:36
sjohnson la la la 22:55
sorear How does PARENT work in a situation where the package graph has cycles? 23:08