bancorn | howdy! setup rakubrew, raku, and zef. tried a simple thing, installing HTTP::Tiny. wondered if this says anything obv to y'all: | 00:01 | |
``` | |||
[~/src/blockchain/tezos/raku]$ rm -rf /Users/jared/.zef/store/d31ded9e8b0651bd8babec0fcc39ff0a24625d51.tar.gz/ | |||
[~/src/blockchain/tezos/raku]$ zef install HTTP::Tiny | |||
===> Searching for: HTTP::Tiny | |||
===> Testing: HTTP::Tiny:ver<0.1.8>:auth<zef:jjatria> | |||
[HTTP::Tiny] The spawned command 'touch' exited unsuccessfully (exit code: 1, signal: 0) | |||
[HTTP::Tiny] in method mirror at /Users/jared/.zef/store/store/d31ded9e8b0651bd8babec0fcc39ff0a24625d51.tar.gz/lib/HTTP/Tiny.rakumod (HTTP::Tiny) line 185 | |||
[HTTP::Tiny] in block <unit> at t/mirror.t line 55 | |||
===> Testing [FAIL]: HTTP::Tiny:ver<0.1.8>:auth<zef:jjatria> | |||
Aborting due to test failure: HTTP::Tiny:ver<0.1.8>:auth<zef:jjatria> (use --force-test to override) | |||
[~/src/blockchain/tezos/raku]$ zef --version | |||
I got it.. aborted due to a test failure. But doing a `--force-test` override let it install, and use a method | 00:06 | ||
04:06
[Coke] left,
[Coke] joined
|
|||
avuserow | Looks like the failure is in the `mirror` method. I would expect that to fail for you. (Or maybe the test was trying to mirror something where it didn't have permissions) | 07:43 | |
07:46
dakkar joined
|
|||
gfldex | <@!694526400488669234> Did you try Grammar::Debugger to check if it parses differently? | 10:08 | |
Anton Antonov | <@!195453211409121280> No, I have not. I will try that. (I just installed `Grammar::Profiler::Simple` for more-or-less the same reasons.) | 10:09 | |
[Coke] | If we want LSP support, should probably open a ticket in the "problem solving" repo | 15:07 | |
16:40
dakkar left
|
|||
Nemokosch | It would be nice 🙂 | 18:14 | |
By the way... I want to do some sed-style substitution. What characters do I need to escape? How much does it differ from sed? | 18:15 | ||
avuserow | in regexes, there's three kinds of characters, roughly: | 18:18 | |
* alphanumeric - defaults to literal meaning, escaped has special meaning | |||
* symbols - defaults to special meaning, must be quoted or escaped to match the literal character | |||
* whitespace - defaults to ignored, must be quoted or escaped to match the literal character | |||
alphanumeric includes underscore, so it's probably 1:1 with the `\w` character class | 18:19 | ||
Nemokosch | thank you very much 🙂 it's more logical than sed where ( ) + would go to the first group. I will pay attention to that | 18:20 | |
avuserow | yeah, raku grammars and regexes are great. much more consistent even if it's difficult to unlearn the old habits of other tools | 18:22 | |
Nemokosch | also Raku uses $1 $2 $3 over \1 \2 \3 right? like Perl I think | ||
avuserow | docs.raku.org/language/regexes - might be of interest | 18:23 | |
and yes, raku uses the numeric variables, though I think it starts counting from 0. | |||
m: "foobar" ~~ /(o)/; say $0; say $1; | 18:24 | ||
probably needs a `:g` flag to get the second match, I keep forgetting that | |||
Nemokosch | so $0 is not the whole matching string? that's strange | ||
avuserow | well, `$0 $1 etc` are equivalent to `$/[0] $/[1] etc`, and that object is the result, so you're indexing into the list of matches | 18:26 | |
Nemokosch | where is the whole string then? 😄 | 18:27 | |
lakmatiol | matching on a string will return a list of all matching substrings, captures are stored elsewhere | 18:28 | |
avuserow | [Coke]: definitely a good idea. if we want editor integration then LSP is the way to go these days since you get support for basically every editor with one implementation. | 18:30 | |
Nemokosch | okay so it was indeed the whole matching string actually 🤔 | 18:31 | |
avuserow | ah, yeah, in my example I was only matching a single character at a time | 18:32 | |
Nemokosch | that coincided with the capture group | ||
avuserow | m: "foobar" ~~ m:g/(o)/; dd $/; # I should've written something more like this | ||
m: "foobar" ~~ m:g/(o); say $0; say $1; | 18:33 | ||
m: "foobar" ~~ m:g/(o)/; say $0; say $1; | |||
like that. ☝️ | |||
Nemokosch | I'm quite confused at this point, it's time to try it out xD | 18:34 | |
avuserow | so $0 $1 etc are Match objects. this makes it easy to get other details beyond just the text, like the character positions and the original string. definitely give it a try | 18:35 | |
and if you just want the text, you can do `$0.Str`. I find this a bit less ergonomic than perl and I keep forgetting it, but it's way more powerful. and I wouldn't be surprised if there's some better way to get the match text | 18:36 | ||
Nemokosch | Gotcha | 18:39 | |
It makes sense but it's definitely different from what I used to in sed and also in Python | 18:40 | ||
It makes sense but it's definitely different from what I'm used to in sed and also in Python | |||
lakmatiol | this is pretty close to python, just think of it like using findall by default and getting the list as a result in $/ | 18:47 | |
Nemokosch | when exactly can parentheses be left off? I just realized that $fh.seek(0) worked for me while $fh.seek 0 didn't | 19:21 | |
avuserow | assuming you don't need them for precedence purposes, you can leave them off for function calls, and method calls with no arguments. method calls with arguments need them. | 19:24 | |
method calls without parens can also be written as: `$fh.seek: 0` | 19:25 | ||
Nemokosch | wow 👀 | ||
also while we are at it - can I call seek like a bare function or am I going too far? seek($fh, 0) or something similar | 19:26 | ||
avuserow | only if `seek` is defined as a function in addition to a method. looking at docs.raku.org/routine/seek, I only see it available as `method`, so not that one | 19:27 | |
functions like `join`, `split`, `push`, `pop`, are available as both though, so you can write: `(1..10).join(", ")` or `join(", ", 1..10)` | 19:28 | ||
if you look at docs.raku.org/routine/join, you can see `sub join($separator, *@list)` . maybe best just to `ctrl+f sub` on those pages. | 19:29 | ||
Nemokosch | that's where the question emerged from 😄 | 19:30 | |
avuserow | yeah, no magic here, just code defined as both methods and subroutines. 🙂 | 19:31 | |
Nemokosch | Sorry for the question overload, I'm trying to do a little text processing | 19:46 | |
I have the following scenario: there is a C file that contains a certain preprocessor instruction (#if CPX for the matter) and the inside is always Pascal code | 19:47 | ||
I have certain substitutions for turning the Pascal code into C code | |||
and I can match the inside of this preprocessor instruction | 19:48 | ||
how can I substitute the matching part for the result of my own substitution set if I don't want to do that all inline? | |||
I suppose I should iterate over the matchings and then make some kind of call on them | 19:51 | ||
avuserow | if you have one match object at a time, then you can use Match.replace-with: docs.raku.org/type/Match#method_replace-with | 19:53 | |
I suspect if you tried to use it on several match objects, it would get confused on the lengths. you could manage those offsets yourself, or maybe you can do a while loop with your regex | 19:54 | ||
another idea is to use `split` on the document, and keep the delimiters. then you can operate on each chunk and join it back together | 19:55 | ||
m: my $s = "a-b-c-d"; my @parts = $s.split("-", :v); for @parts {$_ = "_" if $_ eq "-"}; $s = join "", @parts; say $s; # long-winded way to replace dashes with underscores | 19:57 | ||
Nemokosch | Oh, I think I found something... | ||
s// can apparently handle function calls 👀 | |||
avuserow | oof, discord ate some of my underscores. `my $s = "a-b-c-d"; my @parts = $s.split("-", :v); for @parts {$_ = "_" if $_ eq "-"}; $s = join "", @parts; say $s;` | ||
oh yeah that's always an option too 🙂 | 19:58 | ||
Nemokosch | That's a pretty badass option actually 😄 | ||
I like how one can get used to these pleasant surprises with Raku | 19:59 | ||
and I should use $/.Str as an argument probably | 20:13 | ||
or well, $/ but eventually I will only act on the matching string I think | |||
How do I pass a parameter as rw? | 20:54 | ||
hm, or maybe my function declaration should mark this and then it would work? | 20:56 | ||
seems like that's the right approach | 20:57 | ||
hm, wait | 22:20 | ||
subst doesn't set $/ | |||
ooh okay... now this wasn't very intuitive... | 22:45 | ||
the replacement can be a string that can interpolate all random values stuck in $0 or $/ | 22:46 | ||
that's not the same as using a string _inside a callable_ where those variables DO get updated | |||
not very obvious when all the difference between an interpolated string and a callable is a pair of brackets | 22:47 | ||
Anyways, I was quite satisfied with the outcome 😄 | 23:36 | ||
I have learned a lot and if I were to do this by hand, it would have taken not less time. The file was several thousands of lines and the relevant parts were all over the place | 23:37 |