š¦ Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). Log available at irclogs.raku.org/raku/live.html . If you're a beginner, you can also check out the #raku-beginner channel! Set by lizmat on 6 September 2022. |
|||
Xliff | guifa: Actually, the trait would apply a role which would contain bot an $!ast attribute and an .AST method. If detected, any callable will preserve it's AST in $!ast to be retrieved at runtime by .AST() | 00:00 | |
s/any callable/any properly marked Callable/ | |||
guifa | yeah, what I mean is that I believe it's still undecided if a trait's sub will receive the callable itself or the AST of the trait | ||
obviously, a LOT can be done with the latter | 00:01 | ||
but as it's done now, all code assumes a compiled sub | |||
if the decision is made to enable some way for a trait to get the AST | |||
then it would be very easy, as the trait could mix in the role with that attribute | |||
Xliff | My point exactly. | ||
guifa | (obviously, I'm missing back story, I just saw your message to lizmat) | 00:02 | |
Xliff | That's part of a plan I have to take Raku code and output JS for web-based use cases. | ||
Take RakuAST and then transform the nodes to JavascriptAST for eventual .DEPARSE | |||
role ASTPreserved { has $!ast; method .AST { $!ast }; method Str { $!ast.DEPARSE } }; | 00:26 | ||
Now.... where to put it..... Actions.nqp? But I want it exposed to Raku. | |||
guifa wonders if what should be done is for trait_mod subs to themselves have traits to be either run at {Ā or at }. Right now it's always } | 00:43 | ||
tonyo | is that already started? the rakuast -> js ast? | 00:49 | |
Guest94 | librasteve it does not change anything for me. When I use Timestamp grammar/parser I trust it to know what it is. I donāt know to worry about dedicating it some specific chunk. | 01:01 | |
Timestamp already knows how to parse it. | |||
*I donāt want to worry about... | 01:02 | ||
What if it was parsing data like `2024-01-02T12:34+01:00GMT` | 01:03 | ||
Then `\w+` wonāt work anymore. | |||
01:28
kylese left
01:32
kylese joined
01:36
Some-body_ joined
01:39
DarthGandalf left,
Some-body_ is now known as DarthGandalf
|
|||
guifa | Guest94: I believe both me and codesections had a discussion on this aobut a year or two ago | 01:42 | |
There's several different ways for integrating one grammar into another | |||
Guest94 | You mean apart from `is`? | 01:44 | |
I would even say `is` is not integrating one grammar into another, it just inherits a bunch of tokens omitting the most important high-level one ā TOP | 01:45 | ||
But nothing really works for my artificial simple example, and weāve been discussing this quite a bit already here | 01:47 | ||
So I wonder if there is even one way that works | |||
guifa | www.reddit.com/r/rakulang/comments...oughts_on/ Take a look at some of the comments | 01:48 | |
tio.run/##jVC9TsMwEN7zFKc2UhMTpYKB...QKkIodx/AE | |||
You can tweak that to make it more elegant for specific-case scenarios rather than the general case that it was designed for | 01:49 | ||
Guest94 | www.codesections.com/blog/grammatical-actions/ this page is 404 | 01:52 | |
guifa | Note I said comments | ||
Guest94 | I noted | ||
But there might be some good context there too, right? | |||
There seems to be a web-archive snapshot from year 2022 | 01:53 | ||
guifa | eh potentially. I don't know why that one 404s. We were going back and forth a bit so he might have taken it down in favor of a newer article | ||
tonyo | Guest94: what doesnt work in any of the given solutions | 01:55 | |
Guest94 | tonyo It does not parse. Because <timestamp> is in the middle of the Filename TOP, not at the beginning. And there is also something after it. | 01:56 | |
tonyo | what do you mean not at the beginning? | 01:57 | |
guifa | tio.run/##jZDNTsMwEITveYqRiNSmrQKE...jdbuCsrn8A | ||
tonyo | also, how have you changed it and how is it failing? | ||
guifa wonders why this isn't exactly what Guest94 wants | |||
tonyo | i'm getting the sense that this is just crowd source guessing an acceptable solution | 01:58 | |
guifa | grammar Foo assumes no knowledge of the timestamp grammar, other than the identity of the actions class associated with it. It integrates perfectly, with a controllable top level name | ||
Guest94 | tonyo you suggested this: | ||
grammar A { rule TOP { ^ "a"+ $ } }; grammar B { rule TOP { ^ <call-a-grammar> $ }; token b { "b"+ }; }; B.^add_method("call-a-grammar", -> *@_, *%_ { A.parse(@_[*-1].orig) }); dd B.parse("aaaa") | |||
Where <call-a-grammar> is at the beginning of the B::TOP | |||
tonyo | yea, that was the least good as i stated then | ||
Guest94 | Based on that I tried to apply it to my artificial example: pastebin.com/8M25pvWm | ||
Where <call-a-grammar> is a <timestamp> in my case | 01:59 | ||
But it wonāt work because @_[*-1].orig return the whole input string while the TOP rule looks like rule TOP { <name>'-'<timestamp>'.'<extension> } | |||
You can see there is `<name>'-'` in front of it and `'.'<extension>` after. | 02:00 | ||
02:00
DarthGandalf left
|
|||
Guest94 | Timestamp grammar wonāt parse because itās getting also `foo-` and `.bar` apart from it needs. | 02:01 | |
02:01
evalable6 left
|
|||
Guest94 | I made it to parse by cutting off the beginning by reading the `.pos` of already parsed chunk and replacing parse to subparse so that it can consume partially: | 02:02 | |
Timestamp.subparse(@_[*-1].orig.substr(@_[*-1].pos)) | |||
But the fact this *method* consumed something does not seem to propagate properpy up to Filename grammar so it fails to parse when trying to parse `'-'<extension>` as far as I can see | 02:03 | ||
guifa that example could be what Iām looking for, I need to test first | 02:04 | ||
guifa | Guest94: why are you using parse? You should be using subparse | ||
parse will tell TOP to assume ^ and $ | |||
Guest94 | I took tonyoās suggestion, and I actually did change it to subparse | ||
guifa | ah ok, in the most recent pastebin it had parse, hence the question | 02:05 | |
Guest94 | Thatās just the only pastebin I dropped here. I only added in the chat here that I tried to do this: Timestamp.subparse(@_[*-1].orig.substr(@_[*-1].pos)) instead | ||
Which actually parses Timestamp, but it does not integrate properly with the higher-level Filename grammar | 02:06 | ||
02:39
kylese left
02:40
kylese joined
02:49
jpn joined
|
|||
tonyo | dang, forgot about subparse | 02:50 | |
you'll need to combine librasteve's thing in there | |||
err, something like it | 02:51 | ||
02:53
bartolin left,
bartolin joined
02:54
jpn left
03:15
kylese left
03:17
kylese joined
03:56
opus left
|
|||
Guest94 | Woah, this really works: pastebin.com/5k294nfZ this looks exactly how I was imagining. Thanks guifa | 04:39 | |
Though the only big problem I see here is when the parsing fails. There are a lot of errors written to the log and the failure is actually masked. | 04:40 | ||
It does not fail the program, it only misbehaves later. | 04:41 | ||
It looks like this if I just add a space at the beginning of the string I try to parse: pastebin.com/4Xks0MEm | 04:42 | ||
Adding *defined* type helps to prevent the error masking Match:D | 04:52 | ||
What is the best way to handle parsing failures? | 04:55 | ||
Is checking for .defined good enough? Do grammars provide any extra info when parsing fails? | 04:58 | ||
tonyo | that seems like a problem left up to the reader : ). you could use a try | ||
try { .subparse ... } // Nil | 04:59 | ||
or whatever they're supposed to return | |||
maybe it's Failure | |||
Guest94 | I actually donāt know if the problem is in that new method. Do the grammars throw exceptions on parsing by default? | 05:03 | |
It doesnāt seem so. If the parsing fails itās just Nil | 05:04 | ||
If if there are no nesting of other grammars, only tokens | |||
Iām fine with that, just wondering if maybe there is some relatively useful data obtainable for an error message | 05:05 | ||
Some Match object with partially consumed/parsed chunk could be useful for debugging for instance | 05:08 | ||
05:09
epony left
|
|||
Guest94 | Is there some way to validate an expression against some type without creating a variable? | 05:21 | |
Can I somehow filter keys of a hash? Like apply a predicate that decides where to keep the key or omit it? | 05:35 | ||
05:53
Xliff_ joined
|
|||
Xliff_ | \o | 05:53 | |
antoncube: You around? | |||
06:12
Xliff_ left
06:13
Xliff_ left
|
|||
Guest94 | I assume I can use dummy variable for inline type-checking? Like this: my SomeType:D $ = someExpr | 06:32 | |
What method or whatever would you suggest as .reduce but with an accumulator? | 06:36 | ||
I want to write an expression that would populate some value (e.g. an array or a hash) | 06:37 | ||
From what I can see unlike in other languages .reduce (aka fold) in Raku is not designed to take accumulator. | 06:38 | ||
It only applies some operation producing the same type? | |||
06:47
Aedil left
06:50
Aedil joined
07:06
notable6 left
07:18
jpn joined
07:22
jpn left
08:29
abraxxa joined
08:31
abraxxa1 joined
08:35
abraxxa left
08:41
DarthGandalf joined
08:44
sena_kun joined
08:55
maylay left
08:58
maylay joined
09:33
Sgeo left
09:35
jpn joined
09:41
jpn left
|
|||
nemokosch | The "producing the same type" part is more just a semantic expectation than anything enforced | 09:48 | |
09:50
jpn joined
|
|||
And you are right, there is no dedicated accumulator, neither a dedicated direction. The operator decides. You'd have to add the initial value at the right position | 09:51 | ||
Re filtering keys: grep works, it will take Pairs and produce a sequence of Pairs that you can convert back | 09:54 | ||
m: my @lottery = (1..100).pick(10); dd @lottery; my %groups = @lottery.classify(* % 5); dd %groups; dd %groups.grep(.key > 2); %groups.=grep(.key > 2); dd %groups | 09:58 | ||
Raku eval | Array @lottery = [23, 83, 7, 56, 26, 18, 60, 19, 39, 86] Hash %groups = {"0" => $[60], "1" => $[56, 26, 86], "2" => $[7], "3" => $[23, 83, 18], "4" => $[19, 39]} ("3" => $[23, 83, 18], "4" => $[19, 39]).Seq Hash %groups = {"3" => $[23, 83, 18], "4" => $[19, 39]} | ||
nemokosch | Casually ate up a few asterisks | 09:59 | |
Of course it was *.key > 2 | |||
10:07
jpn left
10:17
jpn joined
10:18
abraxxa1 left
10:23
jpn left
10:28
jpn joined
10:34
mark22k left,
mark22k joined
10:36
Xliff_ joined
10:37
jpn left
10:38
Some-body_ joined
10:41
DarthGandalf left
10:42
Some-body_ is now known as DarthGandalf
|
|||
guifa | re grammars, no, they don't throw exceptions on fail. There are ways to do it, for instance, in your Filename, if you want it to throw if the timestamp is invalid... | 11:09 | |
<name> '-' [ <timestamp> || <.bomb> ] '.' <extension> | 11:10 | ||
and then have a method called <.bomb> which could throw an error and potentially output the current match tree | |||
err | |||
method bomb { die "There was a problem at " ~ self.to } | 11:11 | ||
nemokosch | in an eager and "voluntaristic" parser like this, the concept of parse error isn't very much established | 11:12 | |
at the end of the day, the only objective statement is that the parsing failed - why it failed requires certain assumptions about what was surely good | 11:13 | ||
guifa | right. At best we could do is have a bomb for each of the five components -- but that only tells us which component was bad, not what was bad about it | 11:16 | |
And given the idea that we can't introspect the timestamp since it's coming from someone else's module, that's pretty much as good as we can get | |||
11:30
Guest94 left
11:48
jpn joined
11:54
jpn left
12:33
jpn joined
12:38
jpn left
12:42
abraxxa joined
12:49
sjn left
12:55
sjn joined
|
|||
nemokosch | makes sense | 12:58 | |
13:07
TieUpYourCamel left
|
|||
lizmat | discord people: what would be a good URL to use to point to you people on Discord ? | 13:20 | |
13:22
merp left
|
|||
lizmat | nemokosch librasteve antononcube ^^ | 13:24 | |
13:26
timo left
13:27
merp joined
13:28
timo joined
13:34
jpn joined
13:39
jpn left
|
|||
antononcube | @lizmat Hmmā¦ do you mean individually? | 14:01 | |
lizmat | no, to the Raku community on Discord | 14:02 | |
where people would go if they want to join | |||
antononcube | Right ā I used the link on raku.org . | ||
discord.gg/VzYpdQ6 | 14:03 | ||
lizmat | ah, good point thanks both! | ||
and yet another Rakudo Weekly News hits the Net: rakudoweekly.blog/2024/01/02/2024-...-mapĀ³-sum/ | 14:21 | ||
nemokosch | lizmat: the happier syntax sugar in python is not Konstantin Narkhov I think | 14:33 | |
lizmat | Indeed.. oops. | ||
Fixed, thanks for the headsup! | 14:34 | ||
14:35
jpn joined
14:40
jpn left
14:42
melezhik joined
|
|||
melezhik | o/ | 14:42 | |
Happy new year | |||
lizmat | melezhik: insgelijks! (that's Dutch for "the same to you!" | 14:43 | |
melezhik | Just published a small article on new Sparky feature - dev.to/melezhik/sparky-self-hosted...le-ui-4m0n if someone is interested | ||
lizmat: thanks š | |||
lizmat | you just missed the weekly: it will be in the next :-) | 14:44 | |
melezhik | Have some free time on holidays , it's cold in here , so decided to write some stuff | ||
No worries Liz | |||
lizmat | posted on Reddit and programming.dev | 14:45 | |
14:50
melezhik left
|
|||
antononcube | What is the proper way to refer to articles in the advent blog? The full name with the "Day XX" prefix, or just the rest of the name? | 14:52 | |
14:52
melezhik joined
|
|||
melezhik | Thanks a lot, Liz! | 14:53 | |
lizmat | antononcube depends a bit on context, either would be fine, I'd say | 14:54 | |
librasteve | .oO .subparse & method-as-token, eh? nice one tonyo! tbh I was frustrated since it's easy to combine tokens (via is / does / maybe MOP method surgery) but quite a struggle to combine Grammars ... until you know the recipe | ||
pity this Q&A is not on StackOverflow as will be hard to find later when I need it | 14:55 | ||
Guest94: a good challenge - thans for your patience!! | |||
14:57
melezhik left
|
|||
Geth | Ā¦ problem-solving: lizmat unassigned from codesections Issue TAP refers to Perl 6 github.com/Raku/problem-solving/issues/416 | 15:12 | |
15:28
jpn joined
15:36
jpn left,
jpn joined
|
|||
tonyo | hah, librasteve it was definitely a group effort | 15:42 | |
15:42
jpn left
15:56
abraxxa left
16:20
jpn joined
16:25
jpn left
|
|||
[Coke] | If you include the "day" you should include the year, probably, otherwise it won't age well | 16:31 | |
16:38
jpn joined
16:42
jpn left
16:47
jpn joined
17:16
Guest94 joined
|
|||
[Coke] | just opened raku REPL on my mac and getting tons of complains about Cannot locate native library '/var/folders/8n/rypl9_990b9578zd5435pgr40000gn/T/.zef/1702343732.20256/1702343741.20256.5645.427279618365/resources/5342239100523A11F35C47F949A6974841869956.dylib' | 18:07 | |
Haven't run the REPL in a week, but haven't touched rakubrew recently either. | |||
El_Che | did you update the OS or homebrew? | 18:10 | |
18:34
Guest94 left
|
|||
[Coke] | Nope | 18:38 | |
El_Che | mm | 18:39 | |
[Coke] | had Terminal::LineEditor installed. Just did a download (not a build) of 2023.12 via rakubrew, will reinstall T::LE and see if it works. | 18:40 | |
yup. | 18:41 | ||
weird. the folder it's complaining about seems like a zef temp folder, no? | 18:42 | ||
is there a zef command to clean out any builds/downloads? | 18:43 | ||
ok. with the new setup that works, if I delete $TMPDIR/.zef, it breaks again | 18:45 | ||
... I'm guessing the previous failure was due to a reboot and tmp cleanup, then | 18:47 | ||
ugexe: ^^ | |||
once it generates this error, not sure how to get it back. Forcing a re-install doesn't fix it | 18:58 | ||
uninstall/reinstall doesn't work.. | 18:59 | ||
ah, might be a bug in LineEditor itself: github.com/ugexe/zef/issues/546 | 19:04 | ||
(Though why it would persist over a re-install of the module, not sure) | 19:05 | ||
japhb: ^^ Anyone else report this issue? | 19:07 | ||
ah, it's Term::termios | 19:12 | ||
Don't see the RESOURCES .Str issue in particular there. | |||
19:15
abraxxa-home joined
19:16
abraxxa-home left
19:18
abraxxa-home joined
|
|||
[Coke] | github.com/krunen/term-termios/issues/22 | 19:32 | |
.seen krunen | |||
tellable6 | [Coke], I saw krunen 2016-01-09T16:24:27Z in #perl6: <krunen> [Coke]: (re moving Rakudo release tags) I thought I only said it was talked about at some point, but confused discussion happened. Sorry. | ||
19:36
jpn left
|
|||
[Coke] | github.com/retupmoca/P6-LibraryMak...akumod#L89 - is calling .absolute also going to cache the value? | 19:40 | |
(like .Str does in the zef issue above) | |||
ugexe | uninstalling it and/or reinstalling it should fix it yeah. although if its a dependency causing it i'm not sure if you'd have to also reinstall any reverse dependencies | 19:46 | |
[Coke] | Does that .absolute call look sus? | 19:47 | |
jdv | is sus a word now? | ||
ugexe | That .absolute call (or anything that stringifies %?RESOURCES) is arguably wrong. but what you linked is documentation, not actually using it | 19:48 | |
19:59
jpn joined
|
|||
ugexe | I suppose we should also deprecate Distribution::Resource .absolute and .relative | 20:00 | |
20:06
jpn left
|
|||
ugexe | [Coke]: I wonder if you have an older version of Term::termios installed? github.com/krunen/term-termios/com...894849e07d | 20:08 | |
ah right, the depends of Terminal::LineEditor pin to Term::termios:ver<0.2> but the commit above is v0.2.7 | 20:11 | ||
Apparently it pins to v0.2 because of bugs in the later 0.2, so just installing a newer Term::termios manually might not fix it | 20:13 | ||
20:27
jpn joined
20:31
jpn left
|
|||
[Coke] | jdv - it is here, for sure. | 21:33 | |
21:36
Guest94 joined
|
|||
Guest94 | Is there some universal namespace wrapping in Raku? Like if I want to define multiple subroutines but put everything under a namespace. | 21:43 | |
Something like: my \ns = namespace { sub foo {} sub bar {} }; ns.foo; ns.bar? | |||
[Coke] | docs.raku.org/language/packages | 21:45 | |
guifa | package Foo {Ā sub a {Ā ... }; sub b {Ā ... }Ā }; Foo::a, Foo::b. Just be aware that while subs are by default our-scoped, variables will not be. If you want to my-scope a routine within a package (make it invisible to the outside world), just do `my sub c {Ā ... }` to adjust the scope | 21:47 | |
jdv | ha | 22:06 | |
librasteve | m: package Foo { our sub a { 1 } our sub b { 2 } } say Foo::a, Foo::b; | 22:18 | |
Raku eval | Exit code: 1 ===SORRY!=== Error while compiling /home/glot/main.raku Bogus statement at /home/glot/main.raku:1 ------> package Foo { our sub a { 1 } oāur sub b { 2 } } say Foo::a, Foo::b; expecting any of: whitespace | ||
librasteve | m: package Foo { our sub a { 1 }; our sub b { 2 } }; say Foo::a, Foo::b; | 22:19 | |
Raku eval | 12 | ||
librasteve | m: package Foo { sub a { 1 }; sub b { 2 } }; say Foo::a, Foo::b; | ||
Raku eval | Exit code: 1 Could not find symbol '&a' in 'Foo' in block <unit> at main.raku line 1 | ||
librasteve | sub is my-scoped by default | 22:20 | |
Guest94 | m: package Foo { sub a { 1 }; sub b { 2 } }; say a, b; | ||
camelia | ===SORRY!=== Error while compiling <tmp> Undeclared routines: a used at line 1 b used at line 1 |
||
librasteve | stackoverflow.com/questions/337887...-rakuperl6 | 22:23 | |
Subroutines default to lexical (my) scope Methods default to has scope (only visible through a method dispatch) Type (class, role, grammar, subset) and module declarations default to package (our) scope Constants and enumerations default to package (our) scope | |||
also some good advice from jnthn when to do what (eg. use my scope with is export) | |||
m: package Foo {sub a is export {1}; sub b is export {2}}; import Foo; say a,b; | 22:43 | ||
Raku eval | 12 | ||
librasteve | stackoverflow.com/questions/346886...he-program | ||
docs.raku.org/language/module-pack...th_modules | 22:46 | ||
and docs.raku.org/language/modules#UNIT::EXPORT::* if you want to get fancy | 22:49 | ||
nemokosch | well, this is not great... rakubrew fails with the error Steve already opened an issue for, and rakudo-pkg installs some horribly obsolete version | 23:09 | |
for the new VPS, Debian 12 | |||
eventually I just wget'd the deb file and installed it with dpkg | 23:10 | ||
23:11
Guest94 left
23:19
sena_kun left
23:22
Woodi left
23:44
Sgeo joined
23:58
abraxxa-home left
|