»ö« Welcome to Perl 6! | perl6.org/ | evalbot usage: 'p6: say 3;' or /msg camelia p6: ... | irclog: irc.perl6.org or colabti.org/irclogger/irclogger_log/perl6 | UTF-8 is our friend! 🦋
Set by Zoffix on 25 July 2018.
Geth doc: 93dbf02e35 | (Ben Davies)++ | doc/Language/unicode_entry.pod6
Remove a couple unnecessary lines from XTerm's unicode config
00:03
synopsebot Link: doc.perl6.org/language/unicode_entry
Kaiepi is there a bot that can run code on the jvm or js backend if you tell it to? 00:09
timotimo camelia can, in theory, but i don't think it's set up 00:10
r-j: say "hi"
camelia: help
camelia hi
timotimo: Usage: <(nqp-js|nqp-jvm|debug-cat|rakudo-moar|prof-m|rakudo-jvm|nqp-moarvm|star-m|p5-to-p6|rm|rakudo|r-j|nqp-m|r|p6|nqp|j|rj|sm|p56|perl6|nqp-q|master|star|r-jvm|m|r-m|nqp-mvm)(?^::\s(?!OUTPUT)) $perl6_program>
Geth doc: 8a3efdecf4 | (Ben Davies)++ | doc/Language/grammars.pod6
Remove some incorrect statements from the Grammars article

The dynamic variables section stated that grammars behave like classes, but they don't; they have a completely different metamodel.
00:55
synopsebot Link: doc.perl6.org/language/grammars
Kaiepi rakudo-jvm: use NativeCall 00:56
camelia ( no output )
Kaiepi oh, that was fixed it looks like
after the change to module exports importing NativeCall on the jvm wasn't working for a while 00:57
kawaii Has anyone got a good way of tracking uptime in a daemonised perl 6 app? :) 01:01
my app goes straight into a react whenever loop at start 01:02
AlexDaniel Xliff: no, sake is an alternative to make 01:03
kawaii: top? 01:05
to see the start time of a process
kawaii AlexDaniel: ah no as in, a timer within the app itself, which would respond to a command :)
sorry for not being clear enough
AlexDaniel kawaii: what about blin? 01:06
:)
kawaii will need to be tomorrow, had some $family issues to deal with today sadly and wasn't able to complete a run AlexDaniel
Geth whateverable: f613a28f59 | (Aleks-Daniel Jakimenko-Aleksejev)++ | Sakefile
Use a regular cross operator instead of Junctions

It used to work but then Sake was changed and it no longer does.
01:07
Geth whateverable: 8299405d4d | (Aleks-Daniel Jakimenko-Aleksejev)++ | 2 files
Don't respond to “note:” messages

Seemed like a good idea but nobody uses it in practice. Moreover, people sometimes say “note: blah blah” and it triggers needlessly.
01:14
whateverable: ee879b28f4 | (Aleks-Daniel Jakimenko-Aleksejev)++ | xt/notable.t
Test that “note:” definitely does not trigger
01:16
jmerelo releasable6: status 05:04
releasable6 jmerelo, Next release will happen when it's ready. R6 is down. At least 1 blocker. 286 out of 666 commits logged (⚠ 1 warnings)
jmerelo, Details: gist.github.com/7e5a9c7044bf355be8...8390ae83df 05:05
lizmat weekly: www.braincells.com/perl/2019/06/pe...ek_14.html 09:05
notable6 lizmat, Noted!
jmerelo Just one answer to top 200 in the perl 6 user survey! docs.google.com/forms/d/e/1FAIpQLS...g/viewform 09:06
Please answer if you have not done so already!
antoniog1miz jmerelo: did you make the PR to Pod::To::Cached? 09:08
jmerelo antoniog1miz: not yet
antoniog1miz: timotimo has already accepted and (I think) released a new version, but I'm busy with other stuff... Will try to do it this morning 09:09
antoniog1miz jmerelo: good 09:10
lizmat and another Perl 6 Weekly hits the Net: p6weekly.wordpress.com/2019/07/01/...n-in-riga/ 10:08
sena_kun lizmat++ # great work 10:35
jmerelo lizmat++ 10:51
todoalreadydone hey everyone! i'm new to perl 6 :) 10:56
jmerelo welcome, todoalreadydone
todoalreadydone i thought perl was a good language for one liners, but my fizzbuzz ended up being 75 lines long. what am i doing wrong? hastebin.com/odenewogix.rb
jmerelo todoalreadydone: he 10:57
todoalreadydone: not _quite_ perl 6, you know ;-)
sena_kun todoalreadydone, you are doing it wrong, you should start with writing moarvm bytecode, it can be aligned in a single line nicely. 11:01
todoalreadydone perfect! thank you
jmerelo sena_kun: :-) 11:02
kawaii AlexDaniel: Blin results in about an hour I think 11:06
AlexDaniel` Yaay 11:19
kawaii ⏳ 1164 out of 1307 modules processed 11:41
kawaii ⏳ 1276 out of 1307 modules processed 12:16
jmerelo kawaii: yeah! 12:18
kawaii in the meantime, still learning p6regex, `if $id ~~ / ^'<@' '!'? \d+ '>'$ | ^\d+$ / { say 'yes' }` I don't know if I'm being too verbose - but $id is a param passed into the method, and I'd like to set the value to JUST the \d+, but still match and extract the \d+ from the first match which contains the entire 'tag'. 12:27
they could be either just a string of numbers, `1241242`, or one of two tag formats `<@2423424>` or `<@!23252323>`
jmerelo kawaii: wrap the \d+ in () 12:28
kawaii: the match will go to $/ or will be returned by the smartmatch.
kawaii oooo okay let me try that!
jmerelo kawaii: if you want to extract the whole thing (with alternatives), just wrap it all in () 12:29
kawaii m: my $id = '<@!234234123415>'; if $id ~~ / ^'<@' '!'? (\d+) '>'$ | ^(\d+)$ / { say 'yes'; say $/; }
camelia yes
「<@!234234123415>」
0 => 「234234123415」
kawaii jmerelo++
jmerelo kawaii: :-) 12:30
kawaii AlexDaniel: special delivery! usercontent.irccloud-cdn.com/file/...put.tar.gz 12:32
Kaiepi if a library i'm writing needs to run a script in a child process, should i still put it in lib even though it's executable or throw it in a blib dir or something? 13:13
it doesn't make sense to put in bin since it's only meant to be used internally
unless there's a way to tell zef not to install certain binaries or something 13:14
kawaii based on the help jmerelo gave me earlier, I wrote a method! www.irccloud.com/pastebin/FsEsssyy/ 13:35
but, $/.Int does not seem to behave as expected
because $/'s type is Match 13:36
and I don't think it can be coerced
www.irccloud.com/pastebin/P7osvKkN/
kawaii It also seems to not be stripping the characters I do not want to match 13:36
timotimo in that case you may have to .Str.Int 13:39
timotimo actually looks at the code
oh
you can't .Int it because it's got some junk around the number
kawaii yeah, but my smartmatch should eliminate that, no?
timotimo you're already using ( ) around the \d+, which means you'll probably want to use $0 and $1 instead of $/ 13:40
kawaii so $1 for the result of the ()?
timotimo m: say "<\@1234>" ~~ / '<@' '!'? (\d+) '>' | (\d+) /;
camelia 「<@1234>」
0 => 「1234」
kawaii because $0 would be the entire thing that matched I assume
timotimo m: say "1234" ~~ / '<@' '!'? (\d+) '>' | (\d+) /;
camelia 「1234」
0 => 「1234」
timotimo no, $0 is the first one
oh, both get the 0 because of the alteration? 13:41
kawaii method extract-id(:$cmd-obj) { 13:46
my $id = $cmd-obj.args;
if $id ~~ / '<@' '!'? (\d+) '>' | (\d+) / {
return $0.Int;
} else { return content => '_sad trombone_ :trumpet:'; }
}
ugh, client please stop that
moritz timotimo: yes 13:47
kawaii timotimo: my $user-id = self.extract-id(:$cmd-obj); unless $user-id ~~ / ^\d+$ / { return $user-id; }
this works :)
moritz m: say 'b' ~~ /(a)|(b)/; say $0
camelia 「b」
0 => 「b」
「b」
timotimo there's no actual need to have the '<@' '!' (\d+) '>' if you also have the (\d+) in there 13:48
and if you just want the string rather than the match, using .comb(/\d+/) is simpler 13:49
kawaii timotimo: ah thanks, how do I set the minimum length of \d+? :) 13:58
timotimo \d ** {5..*} 14:00
jnthn Any tips on modules for writing XML? (Of course, I find some on modules.perl6.org; more looking for "I used X and it was good/ok/terrible" :) 14:02
moritz I've used XML::Writer for SVG. It's a very direct Perl datastructure => XML translater without any bells or whistles 14:05
was good for my use case 14:06
jnthn OK...know if it handles namespaces (<foo:bar>?)
moritz it uses pair keys as tag names, so I assume it does, you just have to quote your pairs 14:07
jnthn ah, I see :) 14:12
I'll give it a go, thanks
AlexDaniel kawaii: come on, install graphviz :) 14:14
kawaii AlexDaniel: github.com/perl6/Blin/pull/12 ;) 14:16
AlexDaniel Kaiepi: heeyyyy github.com/Kaiepi/p6-Digest-BubbleBabble/pull/1
kawaii I keep missing it because it's not in the readme anywhere 14:17
ah, merged, perfect ;)
AlexDaniel .seen uzluisf 14:18
yoleaux I haven't seen uzluisf around.
AlexDaniel .seen uzl 14:20
yoleaux I saw uzl 30 Jun 2019 00:28Z in #perl6: <uzl> Can somebody show an example of an our-declared class variable and its use across a class hierarchy? As alluded here: docs.perl6.org/language/classtut#State
AlexDaniel .tell uzl plz :) gitlab.com/uzluisf/quine-mccluskey...requests/1
yoleaux AlexDaniel: I'll pass your message to uzl.
AlexDaniel kawaii: what were the endpoints? How did you run it? 14:31
kawaii AlexDaniel: 2019.03 to HEAD
AlexDaniel aaa I'm an idiot I was looking at the wrong file 14:32
AlexDaniel kawaii: locale is still not set? 14:37
anyway, I think it looks good 14:38
I need to go take a nap though :)
but I think we're ready
samcv: ↑
samcv: and by that I mean that it looks like we don't have any moar issue blocking, so feel free to go ahead with the release 14:39
jmerelo releasable6: status 14:59
releasable6 jmerelo, Next release will happen when it's ready. R6 is down. At least 1 blocker. 286 out of 666 commits logged (⚠ 1 warnings) 15:00
jmerelo, Details: gist.github.com/242a4215682f8caebf...769647af5b
Kaiepi i ran into a confusing error while trying to write something a bit weird 15:02
so i have a Net::Telnet::Client and Net::Telnet::Server class, which both either use Net::Telnet::Terminal::UNIX or Net::Telnet::Terminal::Win32 depending on the os 15:03
the client and server are just unit classes, and the terminal modules look something like this hastebin.com/sivovafibe.php
but when i use them it claims merging global symbols failed because of a duplicate definition of Terminal 15:04
where is it getting that from? i checked with git grep and don't see anywhere where that should be happening
it throws the same error if i try to declare the classes in the terminal modules as Net::Telnet::Client::Terminal and Net::Telnet::Server::Terminal instead 15:05
ugexe ye-olde matching-last-namespace-part merge failure bug. used to be on RT somewhere 15:11
Kaiepi maybe not, it's trying to use both Net::Telnet::Terminal::Win32 *and* Net::Telnet::Terminal::UNIX according to RAKUDO_MODULE_DEBUG 15:16
Kaiepi ok when i change `use Net::Telnet::Terminal::UNIX;` to `require Net::Telnet::Terminal::UNIX <Net::Telnet::Client::Terminal>;`, now i get an error that Terminal is already exported when it tries to export Net::Telnet::Server::Terminal 15:32
guess i have to split the 2 modules into 4 15:33
Kaiepi which makes more sense anyways, since the server will eventually need a second file to run in child processes to deal with ptys on unix-like systems 15:38
albertferrico hello guys, how are you? 17:35
I want to check which version of perl6 I have installed and remove it, to install it again fresh from homebrew, any tips on how to start? 17:37
moritz start with perl6 --version
albertferrico -bash: perl6: command not found 17:38
timotimo probably interesting to check "which perl6" and "perl6 -e '.say for $*REPO.repo-chain'
albertferrico so I guess I don't have it?
timotimo ha, oopsie
you may have it, but in a location that's not in your $PATH 17:40
timotimo AFK for a while
albertferrico timotimo ok, that sounds possible. So how can I find it? 17:41
timotimo I'm on a macbook pro laptop 17:42
xinming_ releasable6: status 17:45
releasable6 xinming_, Next release will happen when it's ready. R6 is down. At least 1 blocker. 286 out of 666 commits logged (⚠ 1 warnings)
xinming_, Details: gist.github.com/db86727caebac786c1...64778cdde7
timotimo albertferrico: if you use your Finder's "search for files" thing, you can probably find a file named "perl6" or maybe look for "CORE.setting.moarvm" 17:52
ugexe osx has `locate` by default i think... `locate bin/perl6` should work 17:59
albertferrico looks like it's not installed, so I'll try to installed with brew 18:03
I'll do `brew install rakudo-star` 18:04
after, do I need to do something with the PATH?
I found this qiita.com/B73W56H84/items/2153e6211ed617b4605d 18:07
lembark Sanity check: If I wanted to keep POD in a separate file from the module, other than naming it FooBar.pod6 is there any convention for, say, recording it in the META6 or standard location (e.g., next to the module, in docs/FooBar)? 18:40
antoniog1miz assets
you can make an assets dir an specify the contents in the META6.json
lembark Thank you.
antoniog1miz github.com/JJ/p6-pod-load
in that module you can see an example
(it's not using assets but resources intstead) 18:41
lembark i.e., something like: 18:44
Uploaded file: uploads.kiwiirc.com/files/cd4177e6...pasted.txt
antoniog1miz mmm you can delete the lib line from resources 18:45
lembark Thought the "resources" => "whatever gets installed".
what's the dividing line between them? 18:46
antoniog1miz resources is everything you add to the module that "is not the module"
I dont know how to explain it correctly xd 18:47
lembark: what line?
lembark You just explained it correctly. 18:48
And succinctly :-)
antoniog1miz good then :)
Kaiepi is there a way to export a symbol from another module as the current module's own symbol? (like `export { default as Foo } from Bar` in es6) 18:50
i tried using sub EXPORT and using the module's name as the only key in the map returned but other modules can't find the symbol when i try to use it 18:51
antoniog1miz mmmmm, you can use unit class or unit grammar but I do not know with functions
Kaiepi wdym, like subclassing the other module? 18:52
antoniog1miz mmm nop, I said unit class to directly export the class, but I think that's not useful in your case 18:54
I suppose you have tried "is export"?
Kaiepi that wouldn't work for this, maybe i explained what i'm trying to do badly or something 18:57
this is what Net::Telnet::Terminal::Client looks like atm fpaste.scsys.co.uk/585188
Kaiepi i'm trying to export either Net::Telnet::Terminal::UNIX::Client or Net::Telnet::Terminal::Win32::Client as Net::Telnet::Terminal::Client itself depending on the os 18:58
the module isn't entirely necessary, but it'd help make my code a bit cleaner 18:59
antoniog1miz ooh I see mmm 19:01
Kaiepi oh, maybe is export could work for this if i write `my constant Net::Telnet::Terminal::Client is export = require <...>` 19:02
...nope, can't use :: in a constant declaration 19:05
timotimo huh, i think this is the first time i hear about the assets thing for modules
antoniog1miz (assets is a dir I ussually use, resources is the good one) 19:06
timotimo oh 19:07
ok
antoniog1miz at least that's what I normally see in the META6 modules
how would you do it instead?
timotimo i haven't a clue :)
antoniog1miz ah haha 19:10
Kaiepi ah hah! this works fpaste.scsys.co.uk/585189 19:15
finally found a use for package
antoniog1miz oh nice fix!
lizmat weekly: dev.to/antoniogamiz/work-report-week-5-26c7 19:41
notable6 lizmat, Noted!
Kaiepi ...or not 19:43
Serialization Error: missing static code ref for closure 'run' (gen/moar/stage2/NQPHLL.nqp:2134)
spoke too soon
ugexe what if you use indirect name lookup? `require ::('Net::Telnet::Terminal::Win32::Client')` 20:17
that should prevent the parent namespace from getting created ala
m: require NativeCall::Types; say ::("NativeCall") 20:18
camelia Type check failed in binding to parameter '$top-existing-pkg'; expected Any but got NativeCall (NativeCall)
in block <unit> at <tmp> line 1
ugexe uh, well that works for me locally
$ perl6 -e 'require NativeCall::Types; say ::("NativeCall")'
(NativeCall)
timotimo weird 20:19
Kaiepi the problem was i got the name of the module i was requiring wrong, i forgot to rename it to Net::Telnet::Terminal::UNIX::Server from Net::Telnet::Terminal::ServerMaster 20:24
ugexe but that should result in a very explicit error 20:25
Kaiepi it should...
timotimo do we have a "local cache of ecosystem claims there is no such module available publically" output yet … 20:26
ugexe does zef have telemetry yet? no 20:27
timotimo how do you mean? 20:28
ugexe how else would you determine what modules an ecosystem does not contain that is being requested?
timotimo well, how does "zef list" give the names of all modules?
ugexe @json.map(*.<provides>.keys) or some such 20:29
timotimo JSON::Pointer:ver<1.0>
# JSON::Pointer
# JSON::Pointer::Relative
that could be enough of a hint, maybe
ugexe oh you want to take all given ecosystems, and then find dependencies that do not exist in those ecosystems? 20:30
i thought you meant a record of `zef install Doesnt::Exist`
Kaiepi btw the filename was right, just the module name in the unit class declaration was wrong 20:31
ugexe ah that might be why the error was so bad 20:32
thundergnat . 21:20
Does anyone around have Cairo installed? 21:21
timotimo most people with a linux system, i'm sure
thundergnat Well, I meant the Perl 6 port actually...
If so, what do you get if you grep /path-to-perl6-install/share/perl6/site/sources$ grep "unit module Cairo" * 21:23
For some reason, I have 24 installs on a clean build from scratch.
I wonder if that is why Cairo takes so long to install... 21:24
timotimo wouldn't you get one match per file in the cairo namespace? 21:25
oh, no, it's a single file
btw it turned out i didn't have it
thundergnat But they are all identical
It doesn't seem to be a problem really, I just thought it was weird. 21:26
timotimo oh haha
it installs one file per entry in the provides section
why are they there, that's weird
ugexe thundergnat: `zef list --installed` will tell you everything else installed 21:27
thundergnat timotimo, BTW any thoughts about getting nativecall pass structs by value working? I really miss not having SDL2_ttf :-( 21:28
timotimo oooh
ugexe seeing the list as words instead of sha1s might make it easier to remember what the are
timotimo jeez, that was a thing i was intending to do at some point
d'oh
ugexe: i wonder, is Cairo the only module that has the same values for multiple keys in the provides section? we should be able to very easily query that, right?
also, i'm pretty sure that's not right 21:29
thundergnat I have a version of ttf working quite nicely locally, except for color handling :-(
ugexe that should be fine
although the way installation works it'll create X many copies of that same file, and precompile them all
timotimo froggs did it! 21:30
that commit is from 2015
it was "add provides section for latest panda (S11 support)"
you literally can't just "use Cairo", because that's not in there
ugexe its not wrong
timotimo well, it is now
it may not be wrong, but i do consider it nonsensical in this situation 21:31
ugexe yeah, there is no purpose in doing it this way in this case
it would be when doing -Ilib (not -I. or installed) and the import statement does `use Cario::Foo` before `use Cario` 21:32
all the tests just do `use Cario` so changing it should Just Work 21:34
then installation wont precompile lib/Cairo.pm6 23 times 21:35
timotimo thundergnat: good thing you stumbled upon that 21:40
thundergnat Yeah, Cairo has always been a real drag to install. No wonder if it is compiling it 24 times. 21:41
It was just an accident, I wanted to check something in the source of Cairo but didn't have connectivity so I grepped the sources folder for Cairo and got a whole page of identical entries. 21:44
and said to myself whut? 21:45
thundergnat Anyway ugexe++, timotimo++, thanks 21:48
timotimo pushed to github 21:49
patrickb I have just successfully built and run a rakudo on Windows in "C:\data\p6-repos with spaces\rakudo". 21:51
ugexe in the old days before CURI multiple namespaces pointing to the same file didn't duplicate files 21:53
patrickb++ many have tried, one has finally succeeded 21:54
vrurg m: sub foo { my $a1; { my $a2; { OUTERS::.keys.say } } }; foo 22:01
camelia ($a2 $*DISPATCHER $_)
vrurg Isn't $a1 supposed to be in the list?
timotimo could be a bug in the keys method of the PseudoStash 22:02
there should also be a whole lot more in there i guess?
like all of the core setting
m: say OUTER::.keys
camelia ()
timotimo hm.
vrurg PseudoStash doesn't have keys. It just throws ctxlexpad or alike into Map's $!storage. 22:03
I just have discovered it by trying to get CORE:: hold all symbols from from all loaded COREs
timotimo oh
vrurg LEXICAL:: – apparently, same issue. 22:04
timotimo i guess that can't work, then :)
vrurg Is there a way to merge lexpads into a new one? 22:07
timotimo not to my knowledge 22:12
vrurg Ok, then iteration only. Thanks! 22:13
kawaii so, uh, I'm having a really strange issue, where perl is referring to a 'False' method that does not exist 22:16
www.irccloud.com/pastebin/grQIULD2/
www.irccloud.com/pastebin/F9mHqnTh/
Yet as you can see, there is no False method here, nor did I ask for one (github.com/shuppet/p6-api-discord/...annel.pm6) 22:17
timotimo m: sub test { return a => 1 }; say test 22:19
camelia a => 1
timotimo where is line 116 from Endpoints.pm6?
ugexe the line above it says "# TODO: I don't think we're handling a failure from this correctly"
kawaii timotimo: `my $val = reduce { $^a."$^b"() }, $r, |@f;` 22:20
timotimo are you sure that's correct? :)
kawaii ummmm, no :)
timotimo what's in $r and @f? 22:21
m: say reduce { say $^a, $^b; True }, 1, 2, 3, 4;
camelia 12
True3
True4
True
timotimo m: say reduce { say $^a, $^b; False }, 1, 2, 3, 4;
camelia 12
False3
False4
False
timotimo i assume you've got $r as a starting value and @f has a list of method names? 22:22
kawaii I didn't write large chunks of that library, so unsure
timotimo m: say reduce { say $^a, " ", $^b; $^a."$^b"() }, 1, "succ", "succ", "succ", "pred";
camelia 1 succ
2 succ
3 succ
4 pred
3
timotimo sounds like it should work, unless there's a False in that list :)
kawaii I'll get a local copy of the lib and add a say @f in there 22:23
ugexe m: say reduce { $^a."$^b"() }, (1); 22:24
camelia 1
timotimo we do have a CLI debugger that could help you here maybe :)
ugexe m: say reduce { $^a.""() }, (1);
camelia No such method '' for invocant of type 'Int'. Did you mean any of these?
IO
fc
kv
lc

in block <unit> at <tmp> line 1
ugexe seems like those should be the same 22:25
kawaii timotimo: so looks like you were right, but I don't know _why_ :) www.irccloud.com/pastebin/3UVPVgXu/
timotimo well, something undefined comes in there 22:30
kawaii timotimo: thanks for telling me about the cli debugger, very interesting output that shows me the internals of my app :) 22:36
timotimo that sounds vaguely like the debugger causing a big bad internal error :) :) 22:37
kawaii well, I see a lot of `+ Exception Thrown | Died` but since the app doesn't actually die when I see these I assume it refers to the methods themselves 22:38
timotimo wait, does my debugger cli do that? 22:39
kawaii www.irccloud.com/pastebin/2XHcP3bR/
timotimo: ^
timotimo oh, that's not the debugger i was talking about lol 22:39
kawaii oh :(
but! that means you have a new toy to show me! 22:40
timotimo but if it helps, that's great
it'd be App::MoarVM::Debugger
you'll start a perl6 --debug-port=9999 --debug-suspend (if you want it to pause at the start) and then connect the moar-remote 9999 to it 22:47
vrurg timotimo: BTW, zef still can't install App::MoarVM::Debugger. ;) 22:50
kawaii `App::MoarVM::Debug` ;)
timotimo: thanks, I got it working, but I don't think it's going to give any information that is useful for _me_ :( 22:51
timotimo oh, is that it
kawaii: yeah, you'll have to have breakpoints in the right spot, then you can dig down into objects and such
greppable6: "use Cairo::" 22:55
greppable6 timotimo, Found nothing!
timotimo greppable6: "use Cairo"
greppable6 timotimo, Found nothing!
timotimo greppable6: "Cairo"
greppable6 timotimo, 9 lines, 6 modules: gist.github.com/b66cd4d9985a16345b...c4407b5b79