🦋 Welcome to Raku! raku.org/ | evalbot usage: 'p6: say 3;' or /msg camelia p6: ... | irclog: colabti.org/irclogger/irclogger_log/raku
Set by ChanServ on 14 October 2019.
00:00 Doc_Holliwood left 00:05 vrurg joined 00:08 JRaspass left 00:09 vrurg left 00:10 MasterDuke left 00:29 pecastro left 00:46 leont left 01:03 vrurg joined 01:22 xinming_ left 01:24 xinming_ joined 01:30 vike joined 01:42 JRaspass joined 01:43 xinming_ left 01:45 xinming_ joined 01:54 aborazmeh_ left 01:55 JRaspass left 02:10 grumble left 02:14 grumble joined 02:19 gnufr33dom joined 02:28 lnx joined 02:32 simcop2387 left 02:36 kvw_5_ joined 02:39 kvw_5 left 02:40 mowotter joined 02:41 mowotter left 02:42 mowcat left
vrurg . 02:47
02:52 mowcat joined, Garbanzo joined 02:54 mowcat left 03:01 klapperl left, klapperl joined 03:04 Bucciarati left, avar left 03:16 Bucciarati joined, avar joined, avar left, avar joined 03:22 jmcgnh left 03:30 lnx left 03:31 lnx joined 03:52 xinming_ left 03:53 xinming_ joined 03:59 jmcgnh joined 04:02 DiffieHellman left 04:03 bartolin left 04:04 xelxebar left 04:15 xinming_ left, xinming_ joined, simcop2387 joined, simcop2387 left, simcop2387 joined 04:16 xelxebar joined, DiffieHellman joined 04:17 bartolin joined 04:20 DiffieHellman left 04:22 DiffieHellman joined 04:57 xinming_ left 04:58 xinming_ joined 05:29 xinming_ left, xinming_ joined 05:49 xinming_ left 05:50 xinming_ joined 05:57 kaiwulf left
summerisle i have to write a bunch of basic python for this stupid entry-level course i'm doing for giggles, and my god is it really the fortran of the 21st century. it's so prescriptive and bland. 06:04
06:07 jmerelo joined 06:33 frost-lab joined
parabolize schools seem to abuse python alot 06:36
06:41 ufobat_ joined 06:52 xinming joined 06:55 xinming_ left 07:20 Discipulus joined 07:31 parabolize left 07:34 aborazmeh joined 07:35 Garbanzo left 07:41 stoned75 joined
summerisle i've always disliked python's intentionally restrictive design. i suppose its merits are reflected in the fact that it's popular in the scientific computing community (e.g. lots of people that don't know how to write good code but need to write code) 07:46
07:48 aborazmeh left
summerisle hence my calling it 21st century fortran. 07:49
07:49 wamba joined
summerisle of course, one can make an absolute butchery of python or fortran 07:49
i'd be fine if it would just stay confined to that community, but would really appreciate it if the linux world could distance itself from python a little more 07:51
07:56 stoned75 left 07:58 domidumont joined 08:11 pecastro joined 08:25 Sgeo left 08:26 patrickb joined 08:31 MasterDuke joined 08:51 Doc_Holliwood joined 08:52 dakkar joined 08:57 sortiz left 08:59 sena_kun left 09:02 sena_kun joined 09:07 leont joined 09:12 Geth joined
lizmat clickbaits rakudoweekly.blog/2021/03/01/2021-...t-of-raku/ 09:20
kawaii I'm looking at `head` and `tail` methods on the Array type but maybe there's an easier way - I have an array with x number of items, I'd like to split it into @array1 with the first 2 items, and all the remaining into @array2, but I don't know how many are remaining so I don't think I can just use `tail`, can I? 09:30
09:33 JRaspass joined 09:35 abraxxa left
El_Che lo 09:35
kawaii o/ 09:39
tyil \o
MasterDuke kawaii: maybe destructuring? 09:42
lizmat kawaii: does the original array need to be untouched? 09:44
if not, then something simple like:
m: my @a = ^10; my @b = @a.shift xx 2; dd @a, @b'
camelia 5===SORRY!5=== Error while compiling <tmp>
Two terms in a row
at <tmp>:1
------> 3 = ^10; my @b = @a.shift xx 2; dd @a, @b7⏏5'
expecting any of:
infix stopper
statement end
lizmat Array @a = [2, 3, 4, 5, 6, 7, 8, 9]
m: my @a = ^10; my @b = @a.shift xx 2; dd @a, @b 09:45
camelia Array @a = [2, 3, 4, 5, 6, 7, 8, 9]
Array @b = [0, 1]
lizmat if you just need to iterate 09:46
m: my @a = ^10; .say for @a.head(2); .say for @a.tail(*-2)
camelia 0
lizmat hmmm
m: my @a = ^10; .say for @a.head(2); say "SWITCH"; .say for @a.tail(*-2) 09:47
camelia 0
kawaii lizmat: let me try some of these, thanks :) 09:48
works perfectly, thanks liz 09:50
09:57 xinming left 09:59 abraxxa joined 10:00 xinming joined 10:01 frost-lab left 10:03 abraxxa left 10:04 abraxxa joined 10:13 frost-lab joined 10:15 mniip left
kawaii I never understand these Seq errors, surely it's not in use because I'm just reading it, not mutating it? www.irccloud.com/pastebin/tMaMzKm9/ 10:17
(error in reference to the head and tail methods)
lizmat with filters => foo.map you're effectively binding the Seq to the hash 10:19
you could follow the suggestion of the error, and add .cache to the expression you put in %assets<filters> 10:20
otoh, I wonder if we could get Hash.STORE do that automatically for you 10:21
10:22 mniip joined
lizmat m: my $a = ^10 .map(*.Str); dd $a.head(2); dd $a.tail(2) 10:22
camelia ("0", "1").Seq
The iterator of this Seq is already in use/consumed by another Seq
(you might solve this by adding .cache on usages of the Seq, or
by assigning the Seq into an array)
in block <unit> at <tmp> line 1
lizmat is basically the issue
m: my $a = ^10 .map(*.Str).cache; dd $a.head(2); dd $a.tail(2)
camelia ("0", "1").Seq
("8", "9").Seq
lizmat kawaii: does that make sense? 10:23
kawaii lizmat: yes, thank you for the examples :)
lizmat BTW, looking at your code, it feels you could be better off creating an Assets object 10:24
with defaults/ filters / pandoc-version / warp-version / etc. attributes
and handle the logic in a TWEAK method
you could then use @.filters as the attribute name, and then you wouldn't have the Seq issues 10:25
kawaii Maaaaaybe, this is what I could get working with Cro's template system, which seems to only allow you to pass one "thing" into it for use
lizmat m: my @a = ^10 .map(*.Str); dd @a.head(2); dd @a.tail(2)
camelia ("0", "1").Seq
("8", "9").Seq
lizmat pretty sure Cro's template system also allows methods to be called on the one thing you pass ? 10:26
kawaii Oh right, yeah 10:27
10:27 xinming left
kawaii So I have an assets object and call stuff like `.version` etc on it 10:27
10:28 xinming joined
lizmat class Assets { has @.defaults; has @.filters, has $.pandoc-version, has $.warp-version; method filter-pre() { @!filters.head(2) } ... 10:30
10:35 frost-lab left 10:42 berber44 joined 10:46 patrickb left 10:59 Doc_Holliwood left 11:01 xelxebar left, xelxebar joined
leont m: my &foo = -> { return 42 }; sub bar() { foo(); }; bar(); 11:15
camelia Attempt to return outside of any Routine
in block <unit> at <tmp> line 1
leont I thought that would be legal
Is there any way for me to achieve such a thing?
dakkar pointy blocks aren't routines 11:16
m: my &foo = -> { 42 }; sub bar() { foo(); }; say bar();
camelia 42
dakkar (otherwise `for @a -> $a { return 2 }` would be a bit surprising)
11:17 xinming left
leont I know 11:17
I should have been more specific
I *want* to return from &bar by doing so in &foo
dakkar ah! hmmm 11:18
11:19 xinming joined
leont Then again, I can use last instead, and catch the CX::Last in a CONTROL. Might even look better in my particular case. 11:20
lizmat hmmm... I wonder what the optimization implications are of catching CX::Last control exceptions 11:25
dakkar if I run that code in the repl, it says "Control flow commands not allowed in toplevel" 11:26
11:30 hythm joined 11:33 xinming left 11:35 hythm left, xinming joined 11:36 hythm joined
xinming What is the idiom to append blob to a file? 11:37
lizmat "file".IO.spurt(blob, :append) ? 11:38
if that doesn't work, maybe it should ?
xinming lizmat: This way, It'll always open-close the file,
lizmat well, you did say "file" not "handle" ?
xinming What I mean is something like, given $fh { ...; .append(...); ... } 11:39
But we need to open the $fh before hand 11:40
lizmat "file".IO.open(:append).spurt(Blob) ?
xinming lizmat: Thanks, this is what I want.
lizmat my $h = "file".IO.open(:append); $h.spurt(Blob) ? 11:41
oops :-)
xinming thanks, the .IO.open(:append) is what I want. Will try.
11:42 PimDaniel joined
PimDaniel \o 11:42
What is a constant in raku? 11:43
lizmat my constant FOO = 42;
xinming PimDaniel: my \a = 42;
I never thought we have my constant :-)
lizmat xinming
PimDaniel Ok now : How may we express a constant in a hash key? 11:44
lizmat my constant FOO = 42 is equivalent to:
my \FOO = BEGIN 42
dakkar m: my constant foo=1;foo=3;
camelia Cannot modify an immutable Int (1)
in block <unit> at <tmp> line 1
dakkar m: my constant $foo=1;$foo=3;
camelia Cannot assign to an immutable value
in block <unit> at <tmp> line 1
dakkar interesting difference in error message (reflecting the extra container, I guess) 11:45
PimDaniel ok may we express constant directly into a hash key?
lizmat he...intriguing
%foo<bar> # PimDaniel?
m: my \FOO = 42; BEGIN say FOO # xinming 11:46
camelia (Mu)
lizmat m: my constant FOO = 42; BEGIN say FOO # xinming
camelia 42
hythm Hello, anyone knows of an article or a blog post that explains compile time and runtime in a Raku program? sometimes I see people refering to some parts in code, that it will be executed at compile time or at runtime, and I wonder how could they tell. so I wonder if there is an article that is discussing a Raku program line by line and explaining why this piece of code is executed at compile while this one at runtime.
PimDaniel lizmat : bar will NOT be the value of the constant but the string 'bar' 11:47
for now i must do Str $MYCONST = bar; and insert $MYCONST into hash definition. 11:49
lizmat PimDaniel: not quite sure I follow, could you create a gist ?
dakkar m: my constant THEKEY='bar'; my %hash; %hash{THEKEY}=1; %hash
camelia WARNINGS for <tmp>:
Useless use of %hash in sink context (line 1)
dakkar m: my constant THEKEY='bar'; my %hash; %hash{THEKEY}=1; say %hash
camelia {bar => 1}
dakkar PimDaniel: that?
postfix braces contain an expression, postfix angle-brackets work like quotes 11:50
PimDaniel I must precise: i use positionals : key => val,keynext => nextval, ...
and it's a new method entry. 11:51
lizmat m: my \FOO = "foo"; my %h = (FOO) => "bar"; dd %h 11:52
camelia Hash %h = {:foo("bar")}
dakkar yes but…
lizmat :w 11:53
argh :-)
dakkar m: my \KEY='foo';sub x(:$foo) {}; x( KEY => 1 )
camelia Unexpected named argument 'KEY' passed
in sub x at <tmp> line 1
in block <unit> at <tmp> line 1
dakkar m: my \KEY='foo';sub x(:$foo) {}; x( (KEY) => 1 )
camelia Too many positionals passed; expected 0 arguments but got 1
in sub x at <tmp> line 1
in block <unit> at <tmp> line 1
dakkar looks like the parser behaves differently in an arglist
11:53 xinming left 11:54 xinming joined
lizmat yeah, only bareword fatcomma is interpreted as named argument, I believe purposely so 11:54
PimDaniel I try parentesis... 11:55
It seams to work for what i'm doing. 11:56
May be :A,:B,... whould be better? No? 11:57
Hum , No, i's anothe way to write positionals. 11:58
Ok thank's i will try this way for now.
back later... 11:59
11:59 PimDaniel left
hythm oh, I dound this helpful slides here archive.fosdem.org/2015/schedule/e...ynamic.pdf (Don't know why cdidn't see it the first time I searched about that subject) 12:05
s/dound/found/ 12:07
Geth ecosystem/finanalyst-patch-4: 2549a34142 | (Richard Hainsworth)++ (committed using GitHub Web editor) | META.list
Add Collection-Raku-Documentation

Creates a Collection version of Raku Documentation. github.com/finanalyst/collection-r...umentation Currently, static files generated with this system can be seen at raku.finanalyst.org
ecosystem: finanalyst++ created pull request #584:
Add Collection-Raku-Documentation
ecosystem: 2549a34142 | (Richard Hainsworth)++ (committed using GitHub Web editor) | META.list
Add Collection-Raku-Documentation

Creates a Collection version of Raku Documentation. github.com/finanalyst/collection-r...umentation Currently, static files generated with this system can be seen at raku.finanalyst.org
ecosystem: 29a61464b1 | (Juan Julián Merelo Guervós)++ (committed using GitHub Web editor) | META.list
Merge pull request #584 from Raku/finanalyst-patch-4

Add Collection-Raku-Documentation
12:53 patrickb joined 13:13 vike left 13:15 jmerelo left 13:28 wamba left 13:29 vike joined 13:44 xinming left 13:45 xinming joined
dakkar PimDaniel: lizmat: this works, to pass a named argument whose name is in a constant (or any expression, for that matter): `my constant KEY="foo";sub x(:$foo) { say $foo};x(|{ (KEY) => 3 })` 14:07
tellable6 dakkar, I'll pass your message to PimDaniel
dakkar m: my constant KEY="foo";sub x(:$foo) { say $foo};x(|{ (KEY) => 3 })
camelia 3
dakkar it's pretty ugly, but I guess it's a weird enough use case 14:08
14:22 kaiwulf joined
codesections dakkar: you could (slightly) beautify that expression by changing the last bit to x |%(KEY, 3) 14:37
dakkar but then it no longer looks like a pair… it's odd either way, though 14:38
codesections fair 14:39
vrurg The ugliness is a way to protect from unexpected behaviors. Just imagine all kinds of 'side effects' if there is a key in the code and a module starts exporting a constant of the same way at some point. 14:54
vrurg doesn't see why a named parameter name should be in a constant? 14:55
dakkar vrurg: I'm not sure, I'm just answering the question ☺ 15:00
vrurg dakkar: not your code? 15:01
dakkar no
I mean, the "solution" is mine, the question was PimDaniel's 15:02
codesections On reflection, I might actually go with `x |(«KEY» => 3)` if faced with this (admittedly very odd!) use case 15:05
Though I'd also give some serious thought to the design decisions that brought me to that point :D
dakkar codesections: that wouldn't do what was requested, though: double quotes (and double angle brackets) don't interpolate sigil-less names 15:14
codesections oh, shoot, you're right. That's what I get for giving the question more reflection without giving it any more testing! 15:20
15:22 linkable6 left, evalable6 left, xelxebar left, xelxebar joined, linkable6 joined 15:24 evalable6 joined 15:35 patrickb left 15:37 patrickb joined 16:04 rindolf joined 16:08 parabolize joined 16:09 sortiz joined
sortiz \o #raku 16:10
16:11 Sgeo joined 16:12 vike left 16:18 jmerelo joined
sortiz codesections: Still interested in cheap tuples? 16:23
16:29 vike joined
summerisle sortiz: i might be 16:31
16:32 PimDaniel joined
sortiz A declarative style subset works 16:32
m: subset XY of List where (Int:D, Int:D); sub pointM(XY \a, Int $e --> XY) { a »*» $e }; pointM (1,2), 3; 16:33
camelia ( no output )
sortiz m: subset XY of List where (Int:D, Int:D); sub pointM(XY \a, Int $e --> XY) { a »*» $e }; say pointM (1,2), 3;
camelia (3 6)
PimDaniel \o again.
tellable6 2021-03-02T14:07:31Z #raku <dakkar> PimDaniel: lizmat: this works, to pass a named argument whose name is in a constant (or any expression, for that matter): `my constant KEY="foo";sub x(:$foo) { say $foo};x(|{ (KEY) => 3 })`
16:34 vike left 16:35 rir joined
PimDaniel I try to use modules.raku.org/dist/Term::ReadKe...an:JKRAMER Module. But i can't really understand how it works. I tried to implement the given example but i cannot seriously capture keys. Are there other real live examples? Thanks. 16:35
16:35 xinming left
jmerelo PimDaniel: did you try to use GitHub search to look for other examples? Or check out the tests? 16:36
PimDaniel jmerelo, NO, i often don't even know where to search. 16:37
16:37 xinming joined
PimDaniel On the other hand, I looked at the module code and i see it uses concepts that i do not know yet like Supplier obj. 16:38
jmerelo PimDaniel: Let me compose the search for you
PimDaniel jemerelo : You'r friendly 16:39
jmerelo PimDaniel: there are a few false positives, but this search returns some of them "in the wild" github.com/search?q=%22use+Term%3A...amp;l=Raku 16:40
PimDaniel:3rd and 4th are definitely Rakulang 16:41
16:41 aindilis left
sortiz summerisle, In particular can be used for complex "returns" constraints. 16:41
PimDaniel jemerelo: ok thank's i'll look at it. My code nearly works but in some situations the loop goes forever so i think my code is bad. 16:42
rir Is there sugar for the transform: ( 0 ^..^1), (2, 3), [4,5] to [ 0,1,2,3,4,5]? 16:43
or a list?
16:44 wamba joined
lizmat 0^..^1 ?? 16:44
m: dd flat ( 0..1), (2, 3), [4,5] 16:45
camelia (0, 1, 2, 3, 4, 5).Seq
jmerelo PimDaniel: It might, but it might also be some misunderstanding in the instructions... or its lack thereof.
lizmat m: dd flat ( 0..1), (2, 3), [4,5] # rir
camelia (0, 1, 2, 3, 4, 5).Seq
PimDaniel jemerelo: for pertinents examples, we would search 'key-pressed' i think. 16:52
16:54 patrickb left
jmerelo PimDaniel: right... Also you might try StackOverflow if everything fails... Either search, or, something that works way better than search, starting to create a question and check out the "related questions" that appear below 16:56
PimDaniel jmerelo: thank you very much, i think i'll be ok! 16:57
16:59 vike joined
jmerelo PimDaniel: sure :-) 17:01
rir Thanks lizmat, now I see a tree in the forest. 17:03
I guess a P5ish prejudice against lists isn't helpful here.
lizmat indeed.... that's one of the false friends 17:04
as is the idea how using a hash instead of a class to get better performance: in Raku, a class is faster, because it can be better optimized 17:05
17:06 PimDaniel left
rir Would that pertain to classes without behavior? 17:06
lizmat you mean something like:
class Point { has $.x; has $.y } vs 17:07
%h<x> and %h<y> ?
rir Yes
lizmat most definitely
github.com/Raku/CCR/blob/main/Rema...-classy.md 17:08
rir Nice to know. I don't try to pre-optimize but being efficent by habit is good. 17:09
I'll check the link.
And its sisters 17:10
17:26 rindolf left
andinus how do i make --help|-h print my custom usage text 17:32
its just a few lines appended to $*USAGE
17:38 rindolf joined
andinus hmm & i also have a sub USAGE() it doesnt get called for some reason 17:39
17:41 ufobat__ joined
andinus hmm the docs say they'll get called if no multi candidate of MAIN matches 17:41
so that makes sense
is there a way i can force --help|-h to call USAGE? 17:42
17:45 ufobat_ left 17:47 dakkar left 17:50 berber44 left 17:54 aluaces left
codesections andinus: I'm pretty sure that --help (though not -h) is supposed to call USAGE (and to print it on STDOUT and exit with 0) 18:00
so I'd say it's a bug if it doesn't (imo)
hmm, actually, I'm not sure I'd say that after all. Let me think about that some more... 18:05
but, I do have a way that you can call USAGE:
have MAIN be a multi and add this line: 18:10
multi MAIN(Bool :$help, |) { say &*GENERATE-USAGE(&MAIN) }
evalable6 Usage:
/tmp/bN5G3pCtCe [--help] <Any>
codesections (or GENERATE-USAGE instead of &*GENERATE-USAGE if you defined a custom fn) 18:11
18:19 aborazmeh joined 18:24 aluaces joined 18:33 xinming left, xinming joined 18:36 ufobat__ left 18:46 _jrjsmrtn joined, __jrjsmrtn__ left 18:47 ufobat__ joined 18:59 jmerelo left 19:06 Garbanzo joined 19:09 abraxxa left 19:20 Garbanzo left 19:30 aborazmeh left 19:32 aborazmeh joined 19:33 domidumont left 19:35 Garbanzo joined, xinming left 19:36 xinming joined 19:50 mowcat joined 19:51 wamba left 20:03 eax joined 20:16 brtastic joined, Garbanzo left, Garbanzo joined 20:21 sxmx left, ufobat__ left 20:29 Doc_Holliwood joined 20:38 sxmx joined 20:48 brtastic left 21:03 Doc_Holliwood left 21:06 pounce left, fvox_ left, KotH left, KotH joined 21:07 fvox joined 21:08 pounce joined 21:16 Doc_Holliwood joined 21:18 eax left 21:32 rir left 21:41 xinming left 21:42 xinming joined 21:43 rindolf left 21:54 aborazmeh left 22:10 gugod left 22:17 Doc_Holliwood left, Doc_Holliwould joined
vrurg .tell tyil Trying to get use of Config module. It feels wrong to me that `.read` overrides environment variables; and that there is no way to only read a single custom file with `.new`. 22:26
tellable6 vrurg, I'll pass your message to tyil
tyil vrurg: hmm, I think the second one would be easier to fix than the first in the current way it's working 22:28
to fix the first one, I would need to keep track of which values were gathered from the environment
(doable, for sure, though) 22:29
vrurg tyil: I would make a single method of importing values and use it everywhere. The method then would have support for :from-xdg, and :from-env. It could be read itself. 22:30
And then it could in turn call a private !read-from-file. 22:31
22:32 gugod joined
tyil can you write a small sample of how you would like to use it in that manner? 22:34
might give me a better idea of the interface I could work towards
my current goal with Config is that I never actually need to manually read from additional files, but I can see how that might not be beneficial for everyone 22:35
vrurg What I currently do requries exactly one config in the only posssible location. So, my choice would be Config.new(:$file, :!from-xdg). 22:36
tyil: But it feels to me that something like `$cfg.read($file, :!from-xdg, :from-env)` could also be sometimes useful. Say, somebody would like to update the existing config in the middle of app lifetime. 22:39
tyil yeah, that sounds reasonable
22:39 Discipulus left
tyil I'm contemplating if I should use `:@files` instead of `:$file`, to allow one or more files 22:40
vrurg tyil: the magic words: multi dispatch ;) 22:41
tyil true
I can't make any guarantee on when I have time to add it, but I will add it to my todo list :>
vrurg tyil: Basically, as I looked into the module, I'd introduce a public .read-data method wich would do all the work and return %data. Make it a class method and it would open more ways to use the module. 22:42
So far, I'm anyway at the most early stage of the project. It can certainly wait. 22:44
22:49 kerframil joined 22:52 xinming left 22:53 xinming joined 22:58 xinming left 22:59 xinming joined 23:10 Kaiepi left, Garbanzo left 23:11 Kaiepi joined 23:17 aindilis joined 23:24 Black_Ribbon joined
moon-child is there a more concise way to ensure a regex matches an entire string than putting ^ and $ at the beginning and end? 23:32
MasterDuke i think that's the most concise way 23:47
23:52 agentzh joined, agentzh left, agentzh joined