Camelia, the Perl 6 bug

IRC log for #parrot, 2008-08-24

Parrot | source cross referenced

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

All times shown according to UTC.

Time Nick Message
00:16 md3` joined #parrot
00:21 md3`` joined #parrot
00:55 tetragon joined #parrot
01:16 rurban__ joined #parrot
01:33 Whiteknight joined #parrot
02:11 bacek joined #parrot
02:20 Auzon joined #parrot
02:31 petdance joined #parrot
02:39 md3``` joined #parrot
02:44 md3``` left #parrot
03:08 kid51 joined #parrot
03:14 dalek r30499 | jkeenan++ | scriptconfigure:
03:14 dalek : Delete two unnecessary test files:  we're not going to permit step sequence
03:14 dalek : numbers as values for --fatal-step.
03:14 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30499
03:23 mriou joined #parrot
03:26 mriou hi, I've been looking at parrot recently and have a question about a specific functionality, I'm wondering if there is a way I could implement it
03:26 mriou if someone could help that'd be great, I'm still trying to find my way around
03:27 mriou I'd like to do some language-level AST rewriting, sort of an extension on macros
03:30 mriou anybody?
03:30 purl anybody is there?
03:31 mriou heh, apparently quiet
03:38 cognominal_ joined #parrot
03:43 tetragon joined #parrot
03:49 particle mriou: if you build your language with the parrot compiler toolkit (pct), you can manipulate the ast quite easily
03:52 mriou particle: yeah I've seen that, it's quite nifty
03:52 particle it's parrot's killer app, imo
03:52 mriou but I'm looking for language level constructs, meaning that the tools would have to know about previous language definitions
03:53 particle once you have a parse tree, you have a tree
03:53 particle manipulate at will
03:53 mriou right but it's several layers above the interpreter
03:54 mriou say that in that language one defines something like: macro(`a + `b, add(a,b))
03:54 mriou add being a prefefined function
03:54 particle ok
03:54 Theory joined #parrot
03:54 mriou next 2+3 should get rewritten add(2,3)
03:55 mriou but the initial definition being language level, it has to go to the parser
03:55 mriou and then it's out of the ast hands
03:55 particle macro() can be implemented such that it adds a step to the compile chain
03:56 mriou and what would this step do?
03:56 particle it can look for <digit> infix:<+> <digit> and emit add(<digit>, <digit>)
03:57 particle ...but in tree form
03:57 particle so it'll be PAST::Op('add', $digit1, $digit2) or whatever
03:57 mriou understood but how does this layer know about the previous macro definition?
03:58 mriou would it have access to the interpreter?
03:58 particle yes
03:58 particle i see
03:58 particle 'macro(...)' can be defined such that it's invoked immediately after it's compiled
03:58 mriou exact
03:58 particle :immediate in pir notation
03:59 particle then it can modify the interpreter
04:00 particle i think this will work today
04:00 mriou you could even define a macro like macro(`a = `b, if (isList(a)) produce(concat(a,b)) else produce(a+b))
04:00 particle however, it may require a BEGIN{} semantics if it has side effects
04:00 mriou which means that when applying the macro you need to have access to predefined functions
04:00 mriou yeah probably
04:01 mriou (would have side effects)
04:01 particle well then, it may have to wait for a while as we don't have that in place yet in pct
04:01 particle it is coming, though, just not yet
04:01 mriou which part exactly? access to the interpreter from upper layers?
04:01 particle the top priorities for pct are longest token matching and protoregexes
04:02 particle are you familiar with perl 5's BEGIN{} blocks?
04:02 mriou a bit
04:03 mriou but if fail to see how it would it help
04:03 particle my $x; print $x; BEGIN { $x = 2 }; # prints '2'
04:03 particle the begin block there has a side effect
04:03 particle something outside the block is modified
04:04 mriou right, like a closure
04:04 particle right
04:04 particle pct doesn't handle this yet
04:04 mriou ah ok, got it
04:04 particle it can be made to work, but you'd have to implement it yourself
04:04 mriou I missed the connection between the BEGIN and what PCT didn't support yet
04:04 particle ...or you could wait until it's built in to pct
04:05 mriou implementing it myself meaning? no direct use of PCT?
04:06 particle correct, for that part. but you could use pct for other things.
04:06 mriou ok I see
04:07 particle if you don't need that functionality today, you can start your language implementation now and wait for it
04:07 mriou would you have any pointer on how to add a step to the compile chain?
04:07 mriou some existing code that would do that?
04:07 particle sure, i have a blog post about it...
04:07 mriou nice :)
04:09 mriou that's on parrotblog?
04:10 particle http://use.perl.org/~particle/journal/35343
04:15 mriou perfect, thanks a lot for the help particle, much appreciated
04:15 particle you're welcome.
04:15 particle time for me to watch a little olympics coverage and have another beer
04:15 particle &
04:15 mriou heh! a nice fresh beer
04:16 mriou maybe I'll get one too now ;)
04:41 bacek Ahhh!!! Just watched pmichaud's lightning talk on yapc::eu. ROTFL
04:41 bacek pmichaud++
05:00 tetragon joined #parrot
05:04 Tene purl: seen whiteknight?
05:04 purl whiteknight was last seen on #parrot 1 days, 6 hours, 4 minutes and 20 seconds ago, saying: I could use that to help with a parrot book I'm writing  [Aug 22 22:59:58 2008]
05:29 Psyche^ joined #parrot
05:51 rurban joined #parrot
06:08 tetragon joined #parrot
06:17 Zaba joined #parrot
06:51 Zaba_ joined #parrot
06:58 rurban joined #parrot
07:09 dalek r30500 | allison++ | pdd27mmd:
07:09 dalek : [pdd27mmd] Updating the manifest with new files.
07:09 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30500
07:33 tetragon joined #parrot
07:33 dalek r30501 | fperrad++ | trunk:
07:33 dalek : [Lua]
07:33 dalek : - table.concat aligned with Lua 5.1.4 (refactor)
07:33 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30501
08:17 barney joined #parrot
08:18 tetragon joined #parrot
08:20 * barney is improvising a lightening talk at FrOSCon
08:21 iblechbot joined #parrot
08:22 dalek bernhard.schmalhofer@gmx.de | Pipp:
08:22 dalek link: http://www.perlfoundation.​org/parrot/index.cgi?pipp
08:31 rurban barney: can you look at the pipp parts of my http://code.google.com/p/cygwin-rurba​n/source/browse/trunk/release/parrot/​patches/56554-make-install-lang.patch patch
08:32 barney rurban: I'll look at it tomorrow, after the conference
08:32 rurban ok, load_bytecode is still absolute and cannot be used with installable. as shown in http://use.perl.org/~rurban/journal/37260
08:41 Zaba joined #parrot
08:42 dalek r30502 | moritz++ | trunk:
08:42 dalek : [rakudo] add S29-hash/delete.t to spectest_regression
08:42 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30502
09:08 jason joined #parrot
09:12 jason joined #parrot
09:12 Whiteknight joined #parrot
09:16 rurban_ joined #parrot
09:24 moritz uhm, match variables seem to be fundamentally b0rked in rakudo
09:43 bacek joined #parrot
09:44 mmcleric joined #parrot
09:44 bacek good localtime()
09:44 moritz hi bacek, long time no see
09:45 bacek moritz: quite busy with $dayjob...
09:46 bacek moritz: #57936 ;)
09:47 * bacek reading backlogs.
09:47 bacek mmcleric: hello Slava ;)
09:48 moritz bacek: does this offer any benefit over simple integers, except having a StrPos object?
09:48 moritz I mean, can you access different Unicode levels or something?
09:48 bacek moritz: no, afaik
09:48 bacek moritz: There is not specification for StrPos at all.
09:49 bacek It just mentioned in Str.index and Str.rindex
09:49 moritz bacek: I guess it's an object that is tied to a string position, and you can get the index in bytes, codepoints, graphs etc
09:49 Zaba joined #parrot
09:52 moritz which is why I see no point in implementing it yet, because its benefit isn't yet available (since we don't have mulitple Unicode levels atm - everything is done in codepoints)
09:55 bacek moritz: I agree in general. This implementations is just basement for proper one (and adds 1 passing test ;)
09:57 moritz we should ask pmichaud if I should apply it ( pmichaud: #57936 )
09:57 bacek moritz: (question about ops). Best place to check existed ops is 'src/ops/*.ops'
09:57 moritz bacek: thanks
09:58 bacek and there is no 'rindex' op in str.ops ;)
09:58 moritz aye :(
09:59 moritz and "november" could put it to good use
09:59 bacek moritz: It should be reasonably easy to implement .
10:01 bacek only one question: is it belongs to Parrot or Rakudo.
10:03 moritz I'm not parrot-savy enough to decide that
10:03 moritz maybe ask on the list
10:03 moritz (I'd vote for parrot, since it might be useful for other languages as well)
10:08 bacek moritz: there almost everything ready for rindex in Parrot. It just not implemented.
10:08 bacek moritz: is there any tests for rindex?
10:09 moritz spec/S29-str/rindex.t on the Perl 6 side
10:12 dalek r30503 | moritz++ | trunk:
10:12 dalek : [rakudo] allow access to $/, $!, $_ in while loops, closes RT #58306
10:12 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30503
10:18 dalek r30504 | allison++ | cygwin070patches:
10:18 dalek : Creating branch for testing Reini Urban's Cygwin patches.
10:18 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30504
10:18 tetragon joined #parrot
10:40 rurban okay, I saw it.
10:57 bacek purl: parrotbug?
10:57 purl hmmm... parrotbug is mailto:parrotbug@parrotcode.org or http://svn.perl.org/parrot/​trunk/docs/submissions.pod or see also "rakudobug"
11:01 bacek moritz: around?
11:03 bacek moritz: #58308 and #58310.
11:14 kj joined #parrot
11:19 dalek r30505 | julianalbo++ | trunk:
11:19 dalek : some refactoring of debugger parsing functions
11:19 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30505
11:26 dalek r30506 | smash++ | pdd27mmd:
11:26 dalek : [branches(pdd27mmd]
11:26 dalek :  * convert VTABLE with MMD_ blocks to MULTI definitions in src/pmc/ (still missing two specific cases)
11:26 dalek :  * everything builds ok but expect a lot of tests failures until the new dispatch is in place
11:26 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30506
11:30 rurban Allison?
11:30 purl rumour has it Allison is Allison Randal <mailto:allison@perl.org>
11:31 megamic joined #parrot
11:31 rurban seen Allison
11:31 purl Allison was last seen on #parrot 4 days, 15 hours, 27 minutes and 1 seconds ago, saying: tewk: looks suspiciously like a dylib compiled for the wrong architecture  [Aug 19 20:04:27 2008]
11:31 rurban seen chromatic
11:31 purl chromatic was last seen on #parrot 11 days, 11 hours, 5 minutes and 7 seconds ago, saying: Under 'make test', it balloons up to 1.4 GB RSS for me.  [Aug 13 00:26:42 2008]
11:32 rurban Who gives out commit access here?
11:35 NotFound rurban: somenone that has metacommit privileges.
11:35 rurban I got only contact to Allison and chromatic, and my papers should already have arrived.
11:36 rurban I want to commti my stuff at least to the new cygwin070patches branch (though it has almost nothing to do with cygwin per se, it's an install branch for packagers)
11:39 rurban Who maintains http://www.parrotcode.org/source.html? This should be updated also.
11:44 dalek r30507 | kjs++ | trunk:
11:44 dalek : [pirc/new] add documentation to pir.y
11:44 dalek : + add function documentation
11:44 dalek : + add some comments here and there
11:44 dalek : + add doc. about impl of constant folding and instr. select.
11:44 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30507
12:05 moritz bacek: I'll take a look at it later today
12:15 dalek r30508 | kjs++ | trunk:
12:15 dalek : [pirc/new] allow for declaring special-handled math ops (add, sub, etc) as locals/constants.
12:15 dalek : + oh noes! code duplication!
12:15 dalek : + need a good way to refactor, or maybe a #define. Refactoring not so easy because of Flex's macro stuff (yylval is a macro).
12:15 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30508
12:17 moritz bacek: some of the docs in your patch still refer to index() behaviour
12:17 moritz +If $4 is omitted, B<index> starts searching from the beginning of the string.
12:18 bacek moritz: probably. I'm too lazy at sundays nights ;)
12:20 dalek r30509 | kjs++ | trunk:
12:20 dalek : [pirc/new] allow math-opnames (add, sub, etc) as .const identifiers.
12:20 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30509
12:21 masak joined #parrot
12:25 kid51 joined #parrot
12:26 dalek r30510 | allison++ | cygwin070patches:
12:26 dalek : [cygwin070patches] Apply first round of patches from Reini Urban to a
12:26 dalek : branch for testing and refinement.
12:26 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30510
12:33 dalek r30511 | kjs++ | trunk:
12:33 dalek : [pirc/new] add a few comments on the symbol API.
12:33 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30511
12:34 bacek moritz: btw, I fixed patch from #58310. It now passes all unfudged tests. We just need someone with proper parrot knowledge to submit or reject it.
13:07 dalek r30512 | jkeenan++ | scriptconfigure:
13:07 dalek : Correct syntax of process_options() in two test files and make related adjustments.
13:07 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30512
13:08 dalek r30513 | kjs++ | trunk:
13:08 dalek : [pirc/new] keep track of number of PASM registers per sub. This will be useful for an optimizing register allocator, I think. It's a nice statistic anyway.
13:08 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30513
13:10 megamic joined #parrot
13:22 dalek r30514 | jkeenan++ | newsc:
13:22 dalek : Creating newsc in https://svn.perl.org/parrot//branches
13:22 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30514
13:23 dalek r30515 | jkeenan++ | newsc-30513:
13:23 dalek : Tagging trunk at r30513 so that the newsc can later be synched to it.
13:23 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30515
13:35 Whiteknight joined #parrot
13:39 dalek r30516 | jkeenan++ | newsc:
13:39 dalek : This branch supersedes the scriptconfigure branch.
13:39 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30516
13:41 dalek r30517 | jkeenan++ | scriptconfigure:
13:41 dalek : This branch has been superseded by the newsc branch.
13:41 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30517
13:41 dalek r30518 | jkeenan++ | scriptconfigure-29975:
13:41 dalek : This branch has been superseded by the newsc branch.
13:41 rahuljha joined #parrot
13:41 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30518
13:46 gmansi joined #parrot
13:50 dalek r30519 | jkeenan++ | newsc:
13:50 dalek : Add information re --verbose-step to Configure.pl help message.  Delete info re two superseded options.
13:50 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30519
13:54 tetragon joined #parrot
13:56 cognominal_ joined #parrot
14:09 jhorwitz joined #parrot
14:10 rahuljha_ joined #parrot
14:20 rba joined #parrot
14:20 davidfetter joined #parrot
14:23 tetragon joined #parrot
14:23 jan joined #parrot
14:39 kid51 Configuring Parrot via config file is now available for testing:  http://rt.perl.org/rt3/Tic​ket/Display.html?id=44315
14:45 Infinoid now all we need is an opengl-based configurator :)
14:49 paco joined #parrot
15:19 NotFound Will be nice to be able to configure parrot with a wiimote X-)
15:20 davidfetter anybody working on a c emitter for pge?
15:23 cognominal_ davidfetter, pmichaud has talked about a rewrite of pge in C. I think it will still emit PIR. You should ask him
15:24 davidfetter cognominal_, thanks for the tip
15:24 * davidfetter looking to replace lexx/yacc
15:25 davidfetter hrm. any chance of a pir->c compiler?
15:26 moritz that would have to do garbage collection on its own, for example
15:26 davidfetter ouch
15:28 NotFound Copying the C code for each opcode and linking with libparrot can be a way. A Not-In-Time compiler X-)
15:30 davidfetter hrm
15:43 cognominal_ davidfetter, I think one of the very point of parrot is to have some portable bytecode leveraging a powerful virtual machine so I don't see the interestet of a pir->c compiler.
15:43 davidfetter hrm
15:43 cognominal_ The generated code will be very dependent on the vm anyway
15:44 cognominal_ may be it makes sense for another Perl 6 implementation
15:45 * moritz sense SMOP
15:45 Copas joined #parrot
15:45 cognominal_ yea, but I don't know enough about it to say anything
15:46 davidfetter .oO(-ldwim)
15:47 cognominal_ and for JIT to be really interesting for rakudo, support of static types like int and num in PCT is necessary.
15:48 cognominal_ currently all types are boxed.
15:50 cognominal_ I hope pmichaud will add that so that people will be interested to do more work on JIT because it will directly translated in performances
15:51 xshelf joined #parrot
15:52 moritz which part of PCT are you talking about? the PAST -> POST -> bytecode part?
15:53 cognominal_ on the other hand, PGE emits quite low level code so it may be JITable. I have never checked.
15:53 xshelf i am trying to build parrot/perl6 on windows XP, the build fails looking for sal.h, I am using activestate perl which uses MCVS to build parrot/perl6.
16:07 dalek r30520 | pmichaud++ | trunk:
16:07 dalek : [rakudo]: spectest-progress.csv update: 126 files, 2267 passing tests
16:07 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30520
16:21 paco joined #parrot
16:26 grim_fandango joined #parrot
16:27 dalek r30521 | jkeenan++ | trunk:
16:27 dalek : Applying patch submitted in
16:27 dalek : http://rt.perl.org/rt3/Tic​ket/Display.html?id=57884 by Vyacheslav Matjukhin.
16:27 dalek : Improve way in which Parrot::Configure::Compiler adds codas.
16:27 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30521
16:37 dalek r30522 | allison++ | pdd27mmd:
16:37 dalek : [pdd27mmd] Change the signature string stored in a CallSignature to be more
16:37 dalek : like the PCC signature string.
16:37 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30522
16:58 Zaba_ joined #parrot
17:16 rurban_ joined #parrot
17:48 ujwalic joined #parrot
17:50 ujwalic how can I generate html documentation for parrot source code
17:58 rurban c code with the ususla tools, pir and pasm only via perldoc
17:58 rurban sorry, the usual tools
18:02 cognominal__ joined #parrot
18:05 moritz make html
18:08 dalek r30523 | allison++ | pdd27mmd:
18:08 dalek : [pdd27mmd] Add storage for a return array (if the result PMC(s) are passed in
18:08 dalek : the varargs along with the arguments to the call, PCC-style).
18:08 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30523
18:47 Zaba joined #parrot
18:47 teknomunk_ joined #parrot
19:07 pmichaud moritz: For #58032, how were you thinking the tests would be corrected?
19:07 pmichaud er, #58302
19:08 moritz s:2nd/not //
19:08 pmichaud I think it's not so easy.  :-)
19:08 pmichaud (0|undef && say "not ok 34") || say "not ok 34";
19:09 pmichaud (0|undef && say "not ok 34") || say "ok 34";
19:09 pmichaud will output "ok 34" twice.
19:09 moritz oh dammit
19:09 pmichaud :-)
19:09 moritz you're right
19:10 moritz will prefix:<?> autothread? probably not, right?
19:10 pmichaud actually, I'm wondering if even && will autothread.
19:10 pmichaud now that I think about it.
19:10 Tene || say "ok {$i++}"
19:10 Tene ;)
19:11 pmichaud but yes, afaik prefix:<?> autothreads
19:11 moritz that's a bit nonsensical
19:11 pmichaud why?  it's entirely valid to have a junction of booleans
19:11 moritz is prefix:<?> the same as .true ?
19:11 moritz but is it desired?
19:12 pmichaud I don't know.  I haven't read anything official to indicate that prefix:<?> or .true doesn't autothread
19:12 moritz if .true autothreads, 'if 1|2 { ... } also autothreads
19:12 pmichaud why is that?
19:12 moritz doesn't if call .true?
19:13 moritz I mean there has to be one simple way of getting the truthness out of a junction
19:13 contingencyplan joined #parrot
19:13 pmichaud there is -- evaluate it in boolean context
19:14 pmichaud but .true isn't necessarily a method on a junction
19:14 pmichaud ($a|$b).true  is the same as   $a.true | $b.true
19:14 moritz ok, and prefix:<?> forces boolean context, right?
19:14 pmichaud yes, I understand what you're saying.  I just haven't heard an official answer yet.
19:15 pmichaud One could equally argue that    ?($a|$b)  is equivalent to   ?$a | ?$b
19:15 pmichaud and that collapsing of junctions occurs only at statement sequence points, such as "if"
19:16 pmichaud I'm not necessarily arguing it that way -- I'm just saying we may need clarification.
19:16 pmichaud I *do* know (from conversations with Larry)  that   ($a|$b).foo   autothreads
19:16 moritz but then you get 'if false == ?($a|b)' being 'if false == ?$a || false == ?$b', which is certainly not DWIMmy
19:16 moritz ok, I'll ask the list
19:17 pmichaud why would that not be dwimmy?
19:17 pmichaud it's asking the question of "is either $a or $b false"
19:17 pmichaud (assuming one could do == on false, which probably doesn't do what we want either :-)
19:17 moritz but if ? is boolean context... let's ask the list
19:17 pmichaud I can see two questions
19:17 moritz since False is an Enum type of int, it'l DWIM
19:18 pmichaud not really :-)
19:18 pmichaud == is always numeric equivalence
19:18 pmichaud $a could be 0 but True
19:18 moritz ouch
19:19 pmichaud anyway, yes, let's ask the list if   prefix:<?>  collapses junctions
19:19 pmichaud also if junctions autothread over infix:<&&> and infix:<||>
19:19 dalek r30524 | allison++ | pdd27mmd:
19:19 dalek : [pdd27mmd] Calculate the type tuple for generated NCI MULTIs.
19:19 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30524
19:20 moritz I'll write to the list
19:23 moritz pmichaud: bacek++ submitted two patches that implement rindex in parrot (#58308) and subsequently in Perl 6 (#58310) - do you think it's right to do it parrot?
19:25 moritz I'm about to test it
19:27 moritz breaks the build...
19:30 jhorwitz joined #parrot
19:30 jhorwitz pmichaud: ping
19:31 AndyA joined #parrot
19:46 paco joined #parrot
20:22 rurban_ joined #parrot
20:37 ujwalic_ joined #parrot
20:38 NotFound moritz: rindex is not in pdd28_strings, will be better to discuss the issue before applying the patch.
20:40 moritz NotFound: ok
20:44 rba joined #parrot
21:12 Zaba_ joined #parrot
21:12 tetragon joined #parrot
21:40 paco joined #parrot
22:17 particle joined #parrot
22:17 dalek r30525 | julianalbo++ | trunk:
22:17 dalek : [PDB] some more refactor of command line parsing
22:17 dalek diff: http://www.parrotvm.org/svn​/parrot/revision?rev=30525
22:21 Whiteknight joined #parrot
22:47 raiph joined #parrot
23:27 Khisanth joined #parrot
23:40 kid51 joined #parrot
23:40 Khisanth joined #parrot
23:42 Khisanth joined #parrot

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

Parrot | source cross referenced