🦋 Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). This channel is logged for the purpose of keeping a history about its development | evalbot usage: 'm: say 3;' or /msg camelia m: ... | Log inspection is getting closer to beta. If you're a beginner, you can also check out the #raku-beginner channel!
Set by lizmat on 25 August 2021.
grondilu It's for my protobuf project, fwiw. 00:00
It will be an alternative to code-generation.
grondilu will do that tomorrow, after hopefully having managed to sleep. 00:01
guifa grondilu
Voldenet yeah, hash can actually be faster than code-generation
guifa just get rid of the autocreated method
00:02 grondilu left 00:04 jjido left
guifa that way the fallback will be called 00:05
00:07 z4kz left 00:08 reportable6 left
guifa also in the proxy the $!foo doesn't work, because of the way that gets closured 00:08
so what you want is
00:08 reportable6 joined
guifa m: class Foo { has $!x is built; method FALLBACK($str) is rw { my $ref := $!x; Proxy.new: FETCH => method { $ref }, STORE => method ($v) { say "storing!"; $ref = $v }; }; }; my Foo $x = Foo.new: x => 4; say $x; say $x.x 00:10
camelia Foo.new(x => 4)
4
guifa m: class Foo { has $!x is built; method FALLBACK($str) is rw { my $ref := $!x; Proxy.new: FETCH => method { $ref }, STORE => method ($v) { say "storing!"; $ref = $v }; }; }; my Foo $x = Foo.new: x => 4; say $x; $x.x = 5; say $x.x;
camelia Foo.new(x => 4)
storing!
5
guifa (also, because X is used as the main namespace for errors, I'd recommend against using it as a class name. I generally prefer A or Foo) 00:11
00:26 kaipei joined 00:29 kaiepi left 00:51 guifa left
SmokeMachine m: class X { has $.p; method TWEAK(|) { self.^attributes.first.set_value: self, Proxy.new(FETCH => { 42 }, STORE => method ($n) { say "storing " ~ $n }) } }; say X.new.p 01:36
camelia 42
01:37 frost joined
SmokeMachine m: class X { has $.p; method TWEAK(|) { self.^attributes.first.set_value: self, Proxy.new(FETCH => { 42 }, STORE => method ($n) { say "storing " ~ $n }) } }; my $x = X.new; say $x.p; $x.p = 13; say $x.p 01:37
camelia 42
Cannot modify an immutable Int (42)
in block <unit> at <tmp> line 1
SmokeMachine m: class X { has $.p is rw; method TWEAK(|) { self.^attributes.first.set_value: self, Proxy.new(FETCH => { 42 }, STORE => method ($n) { say "storing " ~ $n }) } }; my $x = X.new; say $x.p; $x.p = 13; say $x.p 01:38
camelia 42
storing 13
42
SmokeMachine grondilu, Voldenet: ^^ 01:39
(That’s how I do it in Red…)
Voldenet Oh, so it is completely possible to store proxy in a field, cool 01:41
02:37 evalable6 left, linkable6 left 02:39 evalable6 joined, linkable6 joined 02:48 qorg11 left 02:50 qorg11 joined 02:51 qorg11 joined 03:09 Sankalp left 03:26 Guest35 left 03:37 Sankalp joined 03:51 Ulti left 03:55 londoed__ left, londoed__ joined 04:27 kaipei left 04:28 Kaiepi joined 05:28 linkable6 left, quotable6 left, nativecallable6 left, reportable6 left, sourceable6 left, bloatable6 left, coverable6 left, tellable6 left, unicodable6 left, releasable6 left, committable6 left, benchable6 left, bisectable6 left, shareable6 left, statisfiable6 left, evalable6 left, notable6 left, greppable6 left, nativecallable6 joined, unicodable6 joined, tellable6 joined 05:29 committable6 joined, greppable6 joined, bisectable6 joined, reportable6 joined, releasable6 joined 05:30 quotable6 joined, bloatable6 joined, sourceable6 joined, notable6 joined 05:31 linkable6 joined, evalable6 joined, statisfiable6 joined, benchable6 joined, shareable6 joined, coverable6 joined 05:48 z4kz joined 05:57 abraxxa joined 06:04 abraxxa left 06:05 abraxxa joined 06:07 reportable6 left 06:10 reportable6 joined 06:25 sena_kun joined 06:27 Altai-man left 06:38 mexen joined 07:10 jjido joined 07:13 abraxxa left 07:52 Sgeo left 08:12 jjido left 08:16 jjido joined 08:22 jaguart joined 08:29 jjido left 08:42 linkable6 left 08:44 linkable6 joined 09:41 Kaiepi left 09:52 guifa joined 10:06 guifa left, Altai-man joined 10:20 Kaiepi joined 10:30 jaguart left 10:46 xinming left, codez left, xinming joined 10:49 z4kz left 11:16 grondilu joined
grondilu hi 11:16
(don't mind me I was just checking if I had messages from yesterday evening talk) 11:17
SmokeMachine grondilu: there was... :)
11:18 wingfold joined
SmokeMachine m: class X { has $.p is rw; method TWEAK(|) { self.^attributes.first.set_value: self, Proxy.new(FETCH => { 42 }, STORE => method ($n) { say "storing " ~ $n }) } }; my $x = X.new; say $x.p; $x.p = 13; say $x.p # grondilu: this one 11:18
camelia 42
storing 13
42
grondilu nice 11:20
can I rely on ^attributes's list order, though? 11:21
can't I use a name instead? 11:22
SmokeMachine Hi people! I've continued playing with some Erlang ideas on Raku, and I had to do some very ugly workarounds for that... :( here is the code I'm playing with (gist.github.com/FCO/c999698b08a54e...ed00ac5ed) and with that I'm being able rune more than one "process" on a execution loop at the same time in parallel, but for that I'm having to use the TakeAfterEachLine module that does exactly that (adds an take call 11:23
after each statement). Can someone see a better way of doing that?
grondilu: sorry, I've done that way only because there was only 1 attribute... on Red I do something like this: 11:24
m: class X { has $.p is rw; method TWEAK(|) { self.^attributes.first(*.name eq "$!p").set_value: self, Proxy.new(FETCH => { 42 }, STORE => method ($n) { say "storing " ~ $n }) } }; my $x = X.new; say $x.p; $x.p = 13; say $x.p
camelia Use of uninitialized value $!p of type Any in string context.
Methods .^name, .raku, .gist, or .say can be used to stringify it to something meaningful.
(Any)
13
in method TWEAK at <tmp> line 1
SmokeMachine m: class X { has $.p is rw; method TWEAK(|) { self.^attributes.first(*.name eq '$!p').set_value: self, Proxy.new(FETCH => { 42 }, STORE => method ($n) { say "storing " ~ $n }) } }; my $x = X.new; say $x.p; $x.p = 13; say $x.p
camelia 42
storing 13
42
SmokeMachine grondilu: ^^ 11:25
Sorry, I lied... I don't use that (`.^attributes.first(...)`) on Red... but I'm sure I've used that somewhere else... 11:28
About the ugly workaround I've mentioned before, I'm mostly talking about using `gather { take }` to separate the "process" into smaller snippets to run some snippets for each "process" each time... 11:30
just for completeness, the output of that code is: usercontent.irccloud-cdn.com/file/.../image.png 11:31
grondilu only tangentially related: 11:36
m: class { method FALLBACK($str, $value) is rw { say "$value" } }.new.foo = "bar"
camelia Too few positionals passed; expected 3 arguments but got 2
in method FALLBACK at <tmp> line 1
in block <unit> at <tmp> line 1
grondilu why were 3 arguments were expected here?
oh I think I see 11:37
m: class { method FALLBACK($str, $value) is rw { say "$value" } }.new.foo("bar") = pi 11:38
camelia bar
Cannot modify an immutable Bool (True)
in block <unit> at <tmp> line 1
grondilu m: class { method FALLBACK($str, $value) is rw { my $ } }.new.foo("bar") = pi
camelia ( no output )
grondilu got it
m: class { method FALLBACK($str, $, $value) is rw { say "$value"; my $ } }.new.foo = pi 11:39
camelia Too few positionals passed; expected 4 arguments but got 2
in method FALLBACK at <tmp> line 1
in block <unit> at <tmp> line 1
grondilu m: my class { method FALLBACK($str, $value) is rw { say $value; my $ } }.new.foo("bar") = pi 11:40
camelia bar
grondilu m: my class { method FALLBACK($str) is rw { Proxy.new: FETCH => method {}, STORE ($v) { say $v } } }.new.foo("bar") = pi 11:41
camelia ===SORRY!=== Error while compiling <tmp>
Variable '$v' is not declared. Perhaps you forgot a 'sub' if this was
intended to be part of a signature?
at <tmp>:1
------> { Proxy.new: FETCH => method {}, STORE (⏏$v) { say $v } } }.ne…
11:42
grondilu m: my class { method FALLBACK($str) is rw { Proxy.new: FETCH => method {}, STORE method ($v) { say $v } } }.new.foo("bar") = pi
camelia ===SORRY!=== Error while compiling <tmp>
Undeclared name:
STORE used at line 1
grondilu m: my class { method FALLBACK($str) is rw { Proxy.new: FETCH => method {}, STORE => method ($v) { say $v } } }.new.foo("bar") = pi
camelia Too many positionals passed; expected 2 arguments but got 3
in method FALLBACK at <tmp> line 1
in block <unit> at <tmp> line 1
grondilu goddamn
m: my class { method FALLBACK($str) is rw { Proxy.new: FETCH => method {}, STORE => method ($v) { say $v } } }.new.foo = pi
camelia 3.141592653589793
grondilu here we go
so I do need both a FALLBACK and a Proxy after all 11:43
that's how I'm going to make pseudo attributes, generated from a spec file. 11:44
SmokeMachine m: my $x = class { method FALLBACK($str) is rw { say "using failback"; self.^add_method: $str, { Proxy.new: FETCH => method {}, STORE => method ($v) { say $v } }; self."$str"() } }.new; $x.foo = pi; $x.foo = 42 # :) 11:47
camelia using failback
3.141592653589793
42
grondilu adding the method in the FALLBACK? 11:49
for performance?
SmokeMachine grondilu: I was just testing, sorry...
grondilu in any case, that seems to work. And it doesn't even look ugly. 11:53
at the end the fields can be used pretty much like they were normal attributes: 11:54
github.com/grondilu/protobuf-raku/...encoding.t
SmokeMachine but it will add the method for the class (and not the instance)... if that's what you want... it should work...
grondilu I don't think I need to add the method if I can rely on the fallback mechanism. 11:55
and no, I don't need a class method. I don't think so anyway. 11:56
12:00 jaguart joined 12:02 frost left 12:03 frost joined 12:06 reportable6 left 12:07 reportable6 joined 12:15 frost left 12:17 frost joined 12:35 Kaiepi left 12:37 abraxxa joined 12:40 linkable6 left 12:43 linkable6 joined 12:44 abraxxa left 12:49 Kaiepi joined
[Coke] m: say "hope every has a {<nice relaxing fun sleepy high-energy>.pick} day." 12:52
camelia hope every has a high-energy day.
[Coke] UGH camelia why.
m: say "hope everyone has a {<nice relaxing fun sleepy high-energy>.pick} day." 12:56
camelia hope everyone has a sleepy day.
[Coke] ok, there, something for everyone.
13:13 frost left
Altai-man is pretty high-energy though, so it wasn't that wrong. : ] 13:15
13:17 Sgeo joined
[Coke] notable6: github.com/Raku/doc/wiki - an attempt to categorize the work to do for the doc repo & site; if you're interested in helping out (as an author, proofreader, etc.), join us on #raku-doc on IRC. 13:20
notable6 [Coke], I cannot recognize this command. See wiki for some examples: github.com/Raku/whateverable/wiki/Notable
lizmat weekly: github.com/Raku/doc/wiki - an attempt to categorize the work to do for the doc repo & site; if you're interested in helping out (as an author, proofreader, etc.), join us on #raku-doc on IRC. 13:21
notable6 lizmat, Noted! (weekly)
[Coke] notable6: weekly github.com/Raku/doc/wiki - an attempt to categorize the work to do for the doc repo & site; if you're interested in helping out (as an author, proofreader, etc.), join us on #raku-doc on IRC.
notable6 [Coke], Noted! (weekly)
[Coke] ... give me a second to figure it out. :)
lizmat ok, within the same second :-)
[Coke] Thank you, lizmat :)
SmokeMachine Does anyone have a better suggestion than the TakeAfterEachLine on this? gist.github.com/FCO/c999698b08a54e...7ed00ac5ed 13:45
lizmat 1. never have a "use" statement in a module ? 13:49
13:49 Kaiepi left
lizmat "my $Pair := $*W.find_single_symbol('Pair', :setting-only);" why not just Pair? 13:50
SmokeMachine: and other than that I have no suggestions :-) 13:51
afk for a few hours&
[Coke] ... why not have a use statement in a module??
El_Che I was thinking the same
lizmat oops: "use lib" statement
[Coke] yes, that needs to go for sure. :) 13:52
lizmat++
lizmat really afk&
[Coke] sorry for bikeshedding, but I'd avoid method named "suicide" 13:53
are you asking for naming suggestions instead of TakeAfterEachLine (which I can't help with because I don't understand what it's doing) or are you asking if there's a better way to do the thing? 13:55
14:09 jaguart left
SmokeMachine Yes, makes sense… 14:14
But I’m any idea of better way of doing that than adding a take before each statement? 14:16
The use lib I’ve added only trying to make Camélia understand that… 14:17
14:22 Kaiepi joined 14:39 Guest35 joined
[Coke] notable6: weekly (raku docs) also if you're interested in volunteering, please look to the wiki page mentioned for notes about a call to happen in the next two weeks (post weekly announcement). 14:47
notable6 [Coke], Noted! (weekly)
Geth ¦ doc: coke self-assigned Planning github.com/Raku/doc/issues/4074 14:50
14:53 n1to joined 14:54 n1to left 14:58 n1to joined 15:08 Sgeo left 15:13 Sgeo joined 16:16 jjido joined 16:44 Altai-man left 16:52 jjido left 16:55 mexen left
[Coke] oof. got a segfault using v2022.04-24-g92ee0a7496 17:04
on windows. will try to narrow it down.
17:34 jaguart joined
[Coke] looks like 2022.04 got past the part where the later version segfaulted. takes 10s of minutes to run the script, so it'll take me a bit to try to bisect. 17:55
18:07 reportable6 left 18:10 reportable6 joined
grondilu m: say grammar { rule TOP { foo } }.parse: "\nfoo" 18:12
camelia Nil
grondilu was expecting a match here^
what could I put in a grammar to ignore empty lines? 18:13
also with: 18:22
m: say grammar { rule TOP { foo } }.parse: "foo\n" 18:23
camelia 「foo
grondilu why does the match include the newline?
gfldex rule uses :sigspace, you may need token instead 18:26
grondilu I do want sigspace, though. 18:28
I just don't get how rules deal with newlines. 18:30
m: say "\n" ~~ /<ws>/
camelia

ws => 「
grondilu m: say grammar { rule TOP { ^ foo } }.parse: "\nfoo" 18:31
camelia
foo」
grondilu I suppose I could remove all empty lines from my initial string, but there has to be a better way 18:35
m: say grammar { rule TOP { foo } }.parse: "\nfoo".subst(/^\n/,'',:g)
camelia 「foo」
grondilu also: 18:38
m: say grammar { rule TOP { ^foo } }.parse: "\nfoo"
camelia Nil
grondilu I don't get why this does not match
oh my bad I see why 18:39
18:40 wingfold left
Xliff \o 18:40
Is there a way to make a constant with a FQN?
Something like "constant I::Want::To::Alias::A::Class = Class::To::Be::Aliased"
18:42 Kaiepi left 18:44 Kaiepi joined
[Coke] we haven't a squashathon in ages, yes? (for docs or otherwise) 18:46
*had
grondilu looked at grammar examples on raku.orp 18:48
*org
grondilu picked the CSS example
grondilu tried it, failed to parse a CSS example found on w3schools 18:49
gist.github.com/grondilu/8d8e4c25c...7170d2b348
grondilu is confused
Xliff grondilu: Which example? 18:51
grondilu examples.perl6.org/categories/pars...ammar.html
[Coke] which w3schools example? 18:53
grondilu www.w3schools.com/css/css_syntax.asp
grondilu considers insalling Grammar::Debugger 18:59
grondilu does it 19:00
ok that does nothing 🤨 19:03
Xliff LOL. It takes some time to get use to.
grondilu: Looks like the declarations rule isn't working.
tonyo also, why force a die instead of just returning an error object with line/character info 19:09
grondilu "And any grammar in the lexical scope of the use statement will automatically have debugging enabled." 19:10
^ not so much for me
ah nevermind, I had put the 'use' statement below the stub declaration. 19:12
<namestart> fails for some reason, I think that's the issue 19:14
Xliff It's not <namestart>. It's declarations. The ruleset doesn't like \n 19:18
grondilu pounders at the irony considering he pulled this example in the hope of learning how to deal with newlines 19:19
Xliff LOL
grondilu: rule change -> rule declarations { <declaration>+ %% "\n" } 19:23
-> rule declaration { <property> ':' <expr> <prio>? ';' }
That should get you to ruleset... which also doesn't work
grondilu the debugger writes a FAIL just below namestart though, doesn't it? 19:24
Xliff Not using tghat.
I'm using Comma
grondilu ah ok
19:29 discord-raku-bot left, discord-raku-bot joined
Xliff grondilu: Last change -> rule ruleset { <selector>+ %% ',' '{' ~ '}' [ "\n"? <declarations> ] } 19:30
From my experience, \n still needs to be explicitly handled, even though <.ws> is supposed to do it. 19:31
So is rule
grondilu Xliff: that still fails for me 19:34
grondilu realizes he wrote one of the parser examples : examples.perl6.org/categories/pars...ewick.html
grondilu has absolutely no recollection of it whatsoever 19:35
you know, it fails even if I write the CSS in one single line 19:39
hum wait, unless it doesn't end with newlines 19:40
then it parses
so it is a newline issue indeed
which is LTA tbh 19:41
I don't write grammars to have to deal with newlines
though I guess they are usually more significant than whitespaces so we must deal with them 19:46
still, public grammar usually don't deal with that. 19:49
Like the one I'm currently working on : developers.google.com/protocol-buf...roto3-spec
19:52 Kaiepi left, Kaiepi joined
grondilu but why didn't `.subst(/^\n/,'',:g)` remove the first newlines anyway? 20:03
m: dd "\n\nfoo".subst(/^\n/,'',:g) 20:04
camelia "\nfoo"
grondilu 🤔
m: dd "\n\nfoo".subst(/^^\n/,'',:g)
camelia "foo"
grondilu m: say "foo\nbar" ~~ /^foo/ 20:05
camelia 「foo」
grondilu 🤨 20:06
ok I think I get it 20:07
20:26 [Coke] left, [Coke] joined 20:57 jaguart left 20:59 guifa joined 21:03 guifa left 21:06 guifa joined 21:17 guifa left 21:27 jjido joined 21:34 [Coke] left, [Coke] joined 21:37 grondilu left 21:50 swaggboi left 22:02 [Coke] left 22:03 swaggboi joined 22:08 [Coke] joined 22:26 hihihi joined 22:34 hihihi left 23:01 n1to left 23:29 Kaiepi left 23:35 Kaiepi joined