This channel is intended for people just starting with the Raku Programming Language ( Logs are available at
Set by lizmat on 8 June 2022.
01:12 jgaz left 01:32 frost joined 03:02 frost left 03:15 razetime joined 07:26 MasterDuke left 07:45 habere-et-disper joined 07:59 dakkar joined 08:00 frost joined
habere-et-disper Hello everyone \o/ 08:06
I have a working recursion whose implicit base case I don't understand. Too much DWIM -- but then that kind of magic is why I adore raku. Would a rakoon care to unravel it for me? I can post a link or we can try here. :)
08:42 razetime left 08:58 razetime joined
dakkar habere-et-disper: we can try ☺ give us the link 09:04
habere-et-disper How does this recursion terminate? 09:26
sub to-roman ( $deca, @units = <
    1000 M  900 CM  500 D  400 CD  100 C   90 XC
      50 L   40 XL   10 X    9 IX    5 V    4 IV
       1 I
         >.pairup ) is export {
            .value x $deca div .key
          ~ to-roman $deca mod .key, @units.skip
                                with @units.head
The final call I think looks something like `to-roman( 0, () )`. This in turn appears to give us:
().head.value x 0 div ().head.key
to-roman 0 mod ().head.key, ().skip
09:26 discord-raku-bot left, discord-raku-bot joined
dakkar ().head is Nil 09:27
therefore, the `with` doesn't execute
that whole body is `something-something with @units.head` 09:28
lizmat also, please use a gist :)
dakkar if there's no head, nothing happens
Nemokosch which makes it work but I'm not sure if I like this design, once again
09:29 frost left
the whole type object/Nil/Empty polemy 09:30
habere-et-disper Thanks @dakkar! 09:32
Nemokosch you know the funny thing is 09:33
the function itself returns Empty on the terminating call xD 09:34
that's why you don't get some horrible warning
habere-et-disper Thank you all for the clarity. I had started to think of `with` as more a nautral language word than having an underlying `if`-like construct. 09:37
Nemokosch `with` is like `if defined` plus `given` 09:42
habere-et-disper That's helpful. Thank you discord-raku-bot. :) 09:45
dakkar discord-raku-bot is the name of the… bot, that bridges IRC with Discord 09:47
the person's name (in this case) is Nemokosch 09:48
habere-et-disper I learnt something -- thanks @dakkar. So is there a discord recommendation for raku then? 09:55
dakkar there's a discord server that is bridged here 09:56
habere-et-disper Are there any builtin aliases for the topic variable? 10:13
lizmat no 10:14
but you can create your own lexically 10:15
for @a -> $foo { }
dakkar also `with $something -> $whatever { say $whatever }`, or `given`, or `if`… 10:27
(also `my $something := $_` may be useful in some cases?) 10:30
habere-et-disper I seem to be able to only do it one way round. I take it this is intentional to avoid double parsing? 10:39
`with @foo -> $bar { $bar-available }`
`$bar-unavailable with @foo -> $bar`
Nemokosch it is intentional 10:40
the former is a pointy block, the latter would be weird as one 10:41
dakkar different explanation: `with $foo` wants a block 11:00
the block may declare parameters (`{…}` is a block, `-> $thing {…}` is a "pointy block" that declares a single scalar positional parameter) 11:01
if the block wants a parameter, the topic gets bound to that
`with` as a statement modifier (the one you write *after* the statement) does not take a block at all
so, there's nowhere to declare parameters, in that case
(same for all other constructs that use the same keyword for their block form and their modifier form) 11:02
Nemokosch same thing, elaborated a bit better 🙂 11:12
habere-et-disper Thank you dakkar. So why do I need the final `given` here: 11:14
`$phone .= substr: 1 if .chars == 11 and .starts-with: 1 given $phone;`
Should it not be able to know from the `.=` what I'm dealing with?
Nemokosch no - `.=` doesn't set the topic variable. Syntactically, it's mo 11:16
re like a "mutating method call"
however, since that is the case, you may drop `$phone` from the beginning of the line, as tonyo pointed out a while ago 11:18
`.= substr: 1 if .chars == 11 and .starts-with: 1 given $phone;`
I think you need to omit the whitespace in this case 11:20
`.=substr: 1 if .chars == 11 and .starts-with: 1 given $phone;`
for whatever reason; I think this does qualify as a bug rather than a feature
habere-et-disper What's the term again for significant whitespace? 11:21
Nemokosch I don't know but that sounds good enough for a name 😄 11:24
habere-et-disper (I think it's free-form or non free-form.)
11:29 razetime left 11:40 razetime joined 12:50 habere-et-disper left, frost joined 13:08 jgaz joined 13:10 razetime left 13:23 frost left 14:05 habere-et-disper joined 14:28 dakkar left 14:34 habere-et-disper left 14:42 dakkar joined 14:54 razetime joined 16:37 dakkar left 17:41 razetime left 20:23 lizmat left 21:23 habere-et-disper joined
habere-et-disper The up-to operator has me sometimes confused. Compare: 21:26
m: my @array = [ 1, 2, 3 ]; say @array[ 0 .. * ]
m: my @array = [ 1, 2, 3 ]; say @array[ 0 ..^ * ]
camelia (1 2 3)
habere-et-disper I was expecting (1 2) on the later, no?
camelia (1 2 3)
gfldex m: my @array = [ 1, 2, 3 ]; say @array[ 0 ..^ ∞ ] 21:29
camelia (1 2 3)
gfldex does that help? :->
habere-et-disper That exhibits the same confusion for me. I was wanting the whole array except the last item and I thought the upto operator was nicer than [ 0 .. *-2 ] 21:32
gfldex `Whatever` is tricky indeed. The linguist was stronger then the computer scientist. 21:34
21:38 lizmat joined
gfldex That postcircumfix doesn't produce an infinite list when given `0..Inf` makes it useful. 21:40
21:41 jgaz left
habere-et-disper It seems that to get the upto operator to behave as I expected, you have to first put a limit on the whatever: 21:45
m: my @array = [ 1, 2, 3 ]; say @array[ 0 ...^ * > .elems ]
camelia (1 2)
Nemokosch I think * in ranges is always just Inf 21:48
regarding the trickyness: as we have come this far, you may notice that `*-1` is not actually... * minus 1, no matter how strange this sounds 21:51
that is, it's not Inf - 1
`*-1` is a WhateverCode, basically a very simple function
the size of the list is substituted into that function, hence `[0 ..^ *-1]` actually works 21:53
similarly, I think `* > .elems` is also a function - a predicate 21:55
by the way, does `.elems` really work in that context? seems surprising to me
habere-et-disper It did for the little test I did. I find this slightly more readable: 21:56
m: my @array = [ 1, 2, 3 ]; say @array[ 0 ..^ @array.end ]
camelia (1 2)
Nemokosch I think `.elems` is actually a gotcha 21:57
it acts on the (possibly) unset topic variable, and here is where things go painfully wrong to my taste
the unset topic variable is `(Any)`, right? Now, when you call `.elems`, it's converted into a list... 21:59
if you hope that list is at least an empty list, you are wrong
It's a one-element list of the `Any` type object...
m: dd .list
> (Any,)
and consequently
m: .elems.say 22:00
that's right... 1 22:01
habere-et-disper Wow! :0 22:08
I must remember to be more careful with .elems!
lizmat hm... number of elems being one, is correct I feel 22:10
but that it auto-converts... feels wrong 22:11
m: dd .elems; dd $_
camelia 1
Any $_ = Any
lizmat Nemokosch: cannot reproduce what you're seeing
m: dd .list # that's explicitely asking for it to become a list 22:12
camelia (Any,)
lizmat m: dd .list; dd $_
camelia (Any,)
Any $_ = Any
lizmat but that still doesn't change the variable *phew*
22:16 habere-et-disper left 22:29 MasterDuke joined 22:30 habere-et-disper joined
Nemokosch .elems is not too explicit 22:50
anyway, why would something that isn't even `defined` have elems? and if it doesn't, any non-zero answer cannot be right
[Coke] m: say 3.list 22:53
camelia (3)
[Coke] m: say 3.list.elems
camelia 1
Nemokosch 22:59
that's the gotcha itself
even Nil.elems is 1 23:01