Camelia, the Perl 6 bug

IRC log for #parrot, 2012-08-30

Parrot | source cross referenced

| Channels | #parrot index | Today | | Search | Google Search | Plain-Text | summary

All times shown according to UTC.

Time Nick Message
00:04 benabik joined #parrot
00:15 benabik ~~
00:31 whiteknight good evening benabik
00:31 benabik o/ whiteknight, how's things?
00:36 kid51 joined #parrot
00:41 whiteknight benabik: things are good enough. Over the weekend we bought a new big-boy bed for my son at Ikea. My hands are still sore from putting it together and punching things out of frustration
00:42 whiteknight but besides sore hands, things are very good. you?
00:42 benabik whiteknight: A little hectic.  Sorting out new classes, committee assignments, TA position, office, daycare, etc.
00:43 benabik stty erase
00:43 benabik ww
00:43 whiteknight What school are you at, again?
00:44 benabik Was at RIT, now University of Rochester.
00:44 benabik Moved down the river.
00:45 whiteknight How is the program there?
00:45 whiteknight I'm still half looking for a program to continue my studies
00:56 kid51 benabik: Does move to UofR mean you finished masters at RIT?
00:56 benabik kid51: I... finished my coursework?
00:56 benabik Thesis was a bit larger and more interrupted by my kid than expected.
00:56 kid51 So are you now PhD candidate?
00:56 kid51 (And do you have a shorter commute?)
00:57 benabik I am a PhD candidate.  The commute is actually a bit longer, since I almost pass RIT on the way to UR.
00:57 kid51 Ah, you must live out in the burbs.
00:58 benabik whiteknight: The program seems pretty good.  There is a very strong sense of community in the department.  And the way they fund students is far more flexible than normal.  I'm not as tied to my advisor's research as it seemed like I would in other schools.
00:58 benabik kid51: Yar, I live out west.
01:10 whiteknight benabik: funding is key. I did my MS for "free" (minus books, fees, etc) and I can't imagine doing it otherwise
01:11 benabik whiteknight: I actually have a reasonable stipend.  :-)  Not great, but much better than I was paid to sysadmin at RIT.  Also, they require trying for several grants.
01:11 benabik (And give help in writing the application.)
01:18 * kid51 was on phone
01:26 * Coke ponders going back for a masters or phd.
01:26 Coke especially since $dayjob has a super generous tuitino program.
01:26 Coke *tuition
01:27 kid51 A tuitino program is one that supplies you with nano-sized tuits, right?  ;-)
01:44 contingencyplan joined #parrot
01:46 dalek Rosella/commandline_2: e1b5631 | Whiteknight++ | src/commandline/ (3 files):
01:46 dalek Rosella/commandline_2: [CommandLine] add a rudimentary ability to require a certain number of positional arguments. Right now we have to give them names, but we can't look them up by name later
01:46 dalek Rosella/commandline_2: review: https://github.com/Whiteknig​ht/Rosella/commit/e1b5631b8e
02:24 MikeFair joined #parrot
02:36 MikeFair Greetings #parrot!
02:39 sorear greetings MikeFair
02:51 MikeFair joined #parrot
03:06 bluescreen joined #parrot
03:16 arnsholt joined #parrot
03:17 mvorl joined #parrot
05:03 bluescreen joined #parrot
05:15 MikeFair if I wanted to implement an if statement, the reference I have says if <logical> however they don't define <logical> anywhere I can see
05:15 MikeFair nor do they talk about it
05:16 MikeFair now I know what they are wanting, but I don't know how to express that in Parrot
05:16 MikeFair or more specificall PCT
05:17 MikeFair Should I just use <EXPR>?
05:21 sorear MikeFair: reading LBAC?
05:24 MikeFair I am, but it's kind of confusing because it kind of looks like Perl6 rules, but isn't, it kind of looks like the language shell mk_language_shell gave me.  Squakk seems to use some older practices that cish does a different way
05:25 MikeFair squakk looks closer to what I want -- but like I said, doesn't seem to fit with what I have/am creating
05:25 sivoais joined #parrot
05:25 MikeFair plus I have this BNF that I'm following: http://www.jaedworks.com/hyperc​ard/scripts/hypertalk-bnf.html
05:25 sorear there have been about five iterations of the perl6/parrot grammar engine
05:25 sorear all subtly different
05:26 MikeFair yeah that's kind of what I seem to be encountering
05:26 sorear *rakudo/parrot perl6-grammar engine
05:26 MikeFair Plus it seems that a lot of this is also just "best practice" conventions
05:27 MikeFair Yeah I've been reading everything I can on Perl6 Grammars too but it seems even those are inconsistent, plus some have mistakes
05:27 sorear pmichaud told me in frankfurt, can I remember...
05:27 sorear C grammars (dead)
05:27 sorear original PGE (dead)
05:27 sorear object-oriented PGE (oldest you're likely to see, the original squaak tutorial used this, no support for inline code so _requires_ actions)
05:28 sorear used by rakudo alpha
05:28 MikeFair Then add on top of that, I can't tell what's my not understanding what I'm reading/learning, and what's just been updated since this was written or a mistake
05:28 sorear nqp-rx (integrated with a perl6 subset, used by Rakudo beta, current squaak tutorial uses this one)
05:28 sorear qregex (newest rakudo regex engine, not currently used in parrotland)
05:29 MikeFair I'm using these references: http://en.wikibooks.org/wiki/Parrot_Virtual_Machi​ne/Squaak_Tutorial/Squaak_Details_and_First_Steps
05:29 MikeFair and
05:29 MikeFair https://github.com/Benabik/cish
05:30 sorear thaaaat would appear to be the original squaak, using grammar engine #3 from the list above
05:30 MikeFair oooohhhhhh
05:30 MikeFair ok
05:31 pmichaud afaik there's not an up-to-date tutorial about writing languages for nqp or parrot.  I'm working on one now.
05:31 sorear cish looks to be using nqp-rx, #4
05:31 MikeFair pmichaud: :)
05:32 sorear it seems odd how there has been a spike in people wanting to use nqp for languages corresponding with the NQP documentation hackathon in Norway
05:32 sorear *coinciding
05:32 pmichaud yeah, things just work out that way sometimes.
05:32 sorear pmichaud: did I miss any in that list?
05:32 pmichaud sorear: looks to me like you got it about right.
05:32 MikeFair * there are no coincidences :) *
05:33 MikeFair pmichaud: If I could make a recommendation, something that would really help me understand this more would be a couple choices to mk_language_shell.pl
05:34 pmichaud MikeFair: like what kinds of "choices" ?
05:34 sorear there are at least five non-Parrot P6grammar engines too (Pugs(?), Niecza, Cursor.pmc, GGE, Pegex)
05:34 pmichaud I suspect that "mk_language_shell" will simply become a github repository for me.  :-)
05:35 * sorear guesses Pugs would have a p6grammar engine unrelated to anything but isn't actually sure
05:35 pmichaud actually, iirc Pugs used PGE for its grammar engine
05:35 MikeFair pmichaud: Something that would help me practice with changing the Grammar.pm without having to mess with Actions.pm or Runtime.pm
05:35 sorear pmichaud: dynamically loading parrot?
05:35 pmichaud MikeFair: oh, to change grammar.pm one typically wants to use --target=parse
05:35 MikeFair pmichaud: In addition to bare
05:35 pmichaud sorear: yeah, something like that.
05:36 pmichaud of course, Pugs used a Parsec grammar to parse its perl6 code; it then used PGE for P6 regular expressions.
05:36 fperrad joined #parrot
05:36 MikeFair pmichaud: Yes, but what I'd like to do is then bind my Grammar.pm results to pre-existing Actions.pm methods
05:37 MikeFair For instance in the existing shell language I don't have blocks or variable declarations or an assignment statement
05:37 pmichaud MikeFair: well, if you change the grammar it often changes what Actions.pm is looking for.  But I'll keep this in mind as I create the tutorials
05:37 * sorear has no idea what mildew or perlito do with p6regex; Regexp::Grammars might also count
05:37 MikeFair pmichaud: The idea is that I'll make sure that i have to make my Grammar.pm line up with what Actions.pm is expecting
05:40 MikeFair For instance, if I want to start a new block, I have to make sure I match it in the proto rule new_block { <*>  } ruleset
05:40 MikeFair Actions.pm then will have the implementation of the new_block method
05:41 pmichaud oops, I'm being kicked out of the room I'm in... bbiaw
05:41 MikeFair That way I can play with different syntaxes to create a new block, I can study how a new block gets created
05:41 MikeFair :)
05:53 MikeFair I have no idea if this one is more recent or older:
05:53 MikeFair http://parrot.github.com/parrot-d​ocs2/2.8.0/html/PCT_Tutorial.html
05:58 MikeFair Can someone help me see if I'm comprehending this right?
05:58 MikeFair rule statement_list { [ <statement> | <?> ] ** ';' }
05:59 MikeFair A <statement> or a something I can't really figure out
05:59 MikeFair repeat that a bunch of times with a ; in between
06:00 MikeFair each one
06:02 moritz <?> matches the empty string
06:03 moritz so it's really just "statements or nothing delimited with ;"
06:03 MikeFair Ahhhh
06:04 MikeFair It seemed to be some kind of "optional"
06:04 MikeFair Is that the same match as <.?>
06:04 MikeFair no I guess it wouldn't be
06:04 MikeFair <.?> would actually consume something
06:07 MikeFair I can see that it works to create separate statments, I just can't see why :(
06:08 MikeFair I can see that ; or newline can separate statements, but it's not clicking for me why they are doing that... or more specifically how the match is being made
06:13 moritz it's the same as  [ <statement>? ';' ]*   except that the version with <?> allows you to omit the last semicolon
06:14 MikeFair ahh ok, I can see that now
06:15 MikeFair and unless otherwise specified each match won't cross a newline boundary?
06:21 moritz I have no idea what <statement> looks like, and if it allows newlines ore not
06:22 MikeFair statement has <EXPR> as the last piece in most cases
06:22 MikeFair when it doesn't, the subrules typically have newline matches in them
06:22 MikeFair err the subrules cross newline boundaries
06:23 MikeFair statement is <statement_control> or <EXPR>
06:23 MikeFair Someone finally explained to me that <EXPR> is being provided by the bowels of the PCT
06:23 moritz also since it's a rule, it implicitly matches <.ws>
06:24 * MikeFair nods.
06:24 MikeFair Right whenever a ' ' occurs it puts in <.ws> right
06:24 moritz so if ws allows newlines, statement_list does too
06:24 moritz correct
06:24 MikeFair it does not allow newlines
06:24 MikeFair and the . in the <.ws> does what again?
06:25 MikeFair i'm still working on all those new operators ? . :
06:26 MikeFair I read them, then have to read them again
06:27 moritz the . supresses capturing
06:27 moritz so there will be no $<ws> to access the matched whitespace
06:32 MikeFair Yeah ok, that makes more sense to me know
06:32 MikeFair err now
06:32 MikeFair I kept reading "ignore the match"
06:32 MikeFair but it wasn't sinking in what exactly that meant
06:33 MikeFair I get it now!  ( And it's going to stick this time ) :)
06:45 MikeFair When I do a 'make $<capturename>.ast'  I'm creating a PAST node with that name?
06:46 MikeFair and filling the value of the node in with the value in the capture?
07:00 arnsholt MikeFair: make $<capture>.ast will make the .ast of the node you're currently be the .ast of the node in $<capture>
07:01 MikeFair arnsholt: So as Grammar.pm is matching stuff it's making an AST node object
07:02 arnsholt No, AST nodes are created by the action methods in Actions.pm
07:02 arnsholt After a successful match rule/token/regex foo will call the corresponding action method foo, with the match object as an argument
07:02 brrt joined #parrot
07:02 arnsholt The action method can then use make to create an AST node for the match
07:03 MikeFair OOHHHHHH, it's not waiting for a terminal,  if there's a rule with the same name as the match, whenever that rule is matched, it calls the method from actions
07:04 MikeFair ?
07:04 arnsholt Yup
07:04 MikeFair err s/rule/action method/
07:05 brrt hi #parrot
07:05 MikeFair (frsit one)
07:05 MikeFair That needs to go into the tutorial :)
07:06 MikeFair arnsholt: That's the first time it's become perfectly clear to me the correlation between the stuff in Grammar.pm and the stuff in Actions.pm (at least that part of it anyway)
07:06 MikeFair :)
07:07 arnsholt Happy to help =)
08:18 Psyche^ joined #parrot
08:28 alin joined #parrot
08:30 preflex_ joined #parrot
09:44 Tene joined #parrot
10:14 kurahaupo joined #parrot
11:32 schmoo joined #parrot
12:37 JimmyZ joined #parrot
12:49 whiteknight joined #parrot
13:04 whiteknight good morning, #parrot
13:04 tadzik good morning whiteknight
13:07 whiteknight hello tadzik, how are you doing today?
13:09 PacoAir joined #parrot
13:11 PacoAir joined #parrot
13:23 tadzik cosimo: whiteknight: pretty good, how about you?
13:26 * Coke is glad about the upcoming nqp docs. The current state of the art has been pretty byzantine for years.
13:27 Coke I'm back at work, sadly didn't finish the partcl-nqp rewrite on nqp-latest over the kind-of-break.
13:38 dalek rakudo/nom: fc88876 | masak++ | src/ (3 files):
13:38 dalek rakudo/nom: X::TypeCheck::MacroUnquote -> X::TypeCheck::Splice
13:39 dalek rakudo/nom:
13:39 dalek rakudo/nom: Also added an $.action attribute, because splicing takes place both during
13:39 dalek rakudo/nom: quasi-block incarnation and during macro application.
13:39 dalek rakudo/nom: review: https://github.com/rakudo/rakudo/commit/fc88876a1b
13:47 bluescreen joined #parrot
13:57 whiteknight Coke: your partcl sprint has been very fun to watch
13:57 whiteknight I am looking forward to getting more things moved to nqp
14:02 Coke whiteknight: more like a run-in-place.
14:04 whiteknight Coke: Whatever it was, it was very inspirational
14:04 dalek partcl-nqp/nqp2: 5768007 | coke++ | / (6 files):
14:04 dalek partcl-nqp/nqp2: Try to do the smallest thing that will work.
14:04 dalek partcl-nqp/nqp2:
14:04 dalek partcl-nqp/nqp2: Bundle the Partcl Actions/Compiler/Grammar together into a single file,
14:04 dalek partcl-nqp/nqp2: add the MAIN() line we expect. This then dies trying to find the "invoke"
14:04 dalek partcl-nqp/nqp2: sub.
14:04 dalek partcl-nqp/nqp2: review: https://github.com/partcl/p​artcl-nqp/commit/5768007afc
14:21 dalek rakudo/nom: 7d10d1a | masak++ | src/Perl6/Actions.pm:
14:21 dalek rakudo/nom: [Perl6::Actions] throw X::TypeCheck::Splice everywhere
14:21 dalek rakudo/nom:
14:21 dalek rakudo/nom: This make the remaining two code paths for macros catch up
14:21 dalek rakudo/nom: with the fact that we now throw X::TypeCheck::Splice when
14:21 dalek rakudo/nom: a macro to be spliced into mainline code doesn't return
14:21 dalek rakudo/nom: an AST. See also fc88876.
14:21 dalek rakudo/nom: review: https://github.com/rakudo/rakudo/commit/7d10d1aae2
14:22 dalek partcl-nqp/nqp: a9fd286 | coke++ | src/init.pm:
14:22 dalek partcl-nqp/nqp: remove references to P6object
14:22 dalek partcl-nqp/nqp: review: https://github.com/partcl/p​artcl-nqp/commit/a9fd286b23
14:22 dalek partcl-nqp/nqp: aaf9633 | coke++ | .gitignore:
14:22 dalek partcl-nqp/nqp: Simplify ignore rules
14:22 dalek partcl-nqp/nqp: review: https://github.com/partcl/p​artcl-nqp/commit/aaf9633097
14:22 dalek partcl-nqp/nqp2: 00334ea | coke++ | src/min.pm:
14:22 dalek partcl-nqp/nqp2: whoops, add "invoke" back in
14:22 dalek partcl-nqp/nqp2: review: https://github.com/partcl/p​artcl-nqp/commit/00334eaf03
14:55 benabik joined #parrot
14:55 benabik ~~
14:58 contingencyplan joined #parrot
15:00 tadzik active benabik
15:04 smash joined #parrot
15:05 smash hello everyone
15:06 whiteknight smash!
15:13 dalek nqp: 2f7b14d | masak++ | src/QAST/B (2 files):
15:13 dalek nqp: add .evaluate_unquotes to BVal and Block
15:13 dalek nqp: review: https://github.com/perl6/nqp/commit/2f7b14d66b
15:18 davidfetter joined #parrot
15:49 dmalcolm joined #parrot
15:56 rurban_mobile joined #parrot
15:56 rurban_mobile hi #parrot
15:58 rurban_mobile found a 3rd threads race in interp->scheduler. reading with Parrot_Scheduler_shift_pmc while writing Parrot_cx_schedule_immediate.
16:03 rurban_mobile looks harmless
16:20 whiteknight okay, let's keep a record of all these things and either mark them with comments or fix them outright
16:20 whiteknight even if they are harmless now, they might not be if we make changes in the future
16:32 rurban_mobile joined #parrot
16:32 rurban_mobile I fixed now 2 of the 3 races I found. Only Task_nci_send left.
16:33 whiteknight wow you're fast
16:33 whiteknight rurban++
16:33 rurban_mobile when the interp is not used anymore, can I replace it with SHIM_INTERP?
16:33 whiteknight yes
16:33 rurban_mobile as first arg in some thread API calls
16:33 whiteknight yes
16:34 rurban_mobile Ok, But I'll send my patch to the list first.
16:34 whiteknight okay
16:34 rurban_mobile Too many SHIM_INTERP changes for me
16:35 Coke alester swoops in every few months and cleans up a lot of those.
16:35 rurban_mobile nine: Why do we need Parrot_thread_get_threads_array at all?
16:36 rurban_mobile nine: Nobody but threads should have access to the static threads_array[]
16:37 whiteknight rurban: it's just an accessor. I don't think it's essential
16:37 whiteknight but it could probably be changed to static
16:38 rurban_mobile I'll leave it in, but don't like it.
16:39 whiteknight make a TODO note. We can figure it out later
16:40 whiteknight but yes, it probably should be a static functi0on
16:41 rurban_mobile Whoops, more races with tsan ./parrot t/src/threads.t
16:41 dalek rakudo/nom: cd02586 | moritz++ | src/ (2 files):
16:41 dalek rakudo/nom: change X::Comp to mean "potentially compile-time"
16:41 dalek rakudo/nom:
16:41 dalek rakudo/nom: There are some cases (like trait application and quasi unsplicing)
16:41 dalek rakudo/nom: that usually happen at compile time, but not always.
16:41 dalek rakudo/nom: When they were thrown at run time, they warned, because
16:41 dalek rakudo/nom: file name and line number were Any. This is now fixed.
16:41 dalek rakudo/nom: review: https://github.com/rakudo/rakudo/commit/cd025862a8
16:41 rurban_mobile read in gc_gms_allocate_pmc_header vs write in gc_gms_allocate_string_storage
16:42 whiteknight teh failz
16:43 rurban_mobile alarm_runloop vs alarm_check is also racy
16:44 whiteknight none of these things surprise me
16:44 whiteknight actually, I thought in that branch gc was per-interp, so there shouldn't be a race there
16:44 whiteknight I have to re-read some code
16:46 dalek parrot/threads: 2206f23 | rurban++ | / (5 files):
16:46 dalek parrot/threads: Fix two threads races, SHIM unused interp
16:46 dalek parrot/threads:
16:46 dalek parrot/threads: threads_array when a thread is add is now protected via a global mutex.
16:46 dalek parrot/threads:
16:46 dalek parrot/threads: tdata->mailbox also needs a lock.
16:46 dalek parrot/threads:
16:46 dalek parrot/threads: Several interp arguments are gone.
16:47 dalek parrot/threads: review: https://github.com/parrot/parrot/commit/2206f23562
16:48 rurban_mobile Now Parrot_thread_create_local_task needs to be locked.
16:50 rurban_mobile alarm_serial seems to need a cond_wait. But this is over my head.
17:01 whiteknight Don't worry. We'll all work on it
17:29 rurban_mobile joined #parrot
17:31 benabik joined #parrot
18:14 kurahaupo joined #parrot
18:17 dalek rakudo/macros-d2: 1ac5431 | masak++ | src/ (2 files):
18:17 dalek rakudo/macros-d2: halfway commit, does not work
18:17 dalek rakudo/macros-d2:
18:17 dalek rakudo/macros-d2: Still seems to be largly an attempt in the right direction, though.
18:17 dalek rakudo/macros-d2: review: https://github.com/rakudo/rakudo/commit/1ac5431b62
18:37 whiteknight joined #parrot
18:38 whiteknight_ joined #parrot
19:15 lucian joined #parrot
19:19 benabik joined #parrot
19:34 benabik joined #parrot
20:18 ruoso joined #parrot
20:19 Timbus joined #parrot
20:40 dalek rakudo/nom: 2311372 | moritz++ | src/core/Stringy.pm:
20:40 dalek rakudo/nom: fix infinite recursion in 42 x Int
20:40 dalek rakudo/nom: review: https://github.com/rakudo/rakudo/commit/2311372b5f
21:01 benabik joined #parrot
21:09 kurahaupo joined #parrot
21:14 lucian joined #parrot
21:41 dalek Heuristic branch merge: pushed 19 commits to nqp/toqast by jnthn
21:45 dalek rakudo/nqpqast: d703632 | moritz++ | src/Perl6/Grammar.pm:
21:45 dalek rakudo/nqpqast: warn on obsolete use of \ and | with sigilled parameter
21:45 dalek rakudo/nqpqast: review: https://github.com/rakudo/rakudo/commit/d7036329db
21:45 dalek rakudo/nqpqast: fc88876 | masak++ | src/ (3 files):
21:45 dalek rakudo/nqpqast: X::TypeCheck::MacroUnquote -> X::TypeCheck::Splice
21:45 dalek rakudo/nqpqast:
21:45 dalek rakudo/nqpqast: Also added an $.action attribute, because splicing takes place both during
21:45 dalek rakudo/nqpqast: quasi-block incarnation and during macro application.
21:45 dalek rakudo/nqpqast: review: https://github.com/rakudo/rakudo/commit/fc88876a1b
21:45 dalek rakudo/nqpqast: 7d10d1a | masak++ | src/Perl6/Actions.pm:
21:45 dalek rakudo/nqpqast: [Perl6::Actions] throw X::TypeCheck::Splice everywhere
21:45 dalek rakudo/nqpqast:
21:45 dalek rakudo/nqpqast: This make the remaining two code paths for macros catch up
21:45 dalek rakudo/nqpqast: with the fact that we now throw X::TypeCheck::Splice when
21:45 dalek rakudo/nqpqast: a macro to be spliced into mainline code doesn't return
21:45 dalek rakudo/nqpqast: an AST. See also fc88876.
21:45 dalek rakudo/nqpqast: review: https://github.com/rakudo/rakudo/commit/7d10d1aae2
21:45 dalek rakudo/nqpqast: cd02586 | moritz++ | src/ (2 files):
21:45 dalek rakudo/nqpqast: change X::Comp to mean "potentially compile-time"
21:45 dalek rakudo/nqpqast:
21:45 dalek rakudo/nqpqast: There are some cases (like trait application and quasi unsplicing)
21:45 dalek rakudo/nqpqast: that usually happen at compile time, but not always.
21:45 dalek rakudo/nqpqast: When they were thrown at run time, they warned, because
21:45 dalek rakudo/nqpqast: file name and line number were Any. This is now fixed.
21:45 dalek rakudo/nqpqast: review: https://github.com/rakudo/rakudo/commit/cd025862a8
21:45 dalek rakudo/nqpqast: 6ae1f62 | jnthn++ | src/ (5 files):
21:45 dalek rakudo/nqpqast: Merge branch 'nom' into nqpqast
21:45 dalek rakudo/nqpqast: review: https://github.com/rakudo/rakudo/commit/6ae1f62a1b
21:48 dalek rakudo/nqpqast: b4a2b7a | jonathan++ | src/Perl6/Grammar.pm:
21:48 dalek rakudo/nqpqast: Patch from tadzik++ to add missing $<spaces>.
21:48 dalek rakudo/nqpqast: review: https://github.com/rakudo/rakudo/commit/b4a2b7a24b
21:48 dalek rakudo/nqpqast: f92c7fb | jonathan++ | src/Perl6/Metamodel/Dispatchers.pm:
21:48 dalek rakudo/nqpqast: Dispatcher fix (also can avoid creating an iterator).
21:48 dalek rakudo/nqpqast: review: https://github.com/rakudo/rakudo/commit/f92c7fb6e6
22:23 rurban_mobile joined #parrot
22:25 benabik joined #parrot
23:09 davidfetter joined #parrot

| Channels | #parrot index | Today | | Search | Google Search | Plain-Text | summary

Parrot | source cross referenced