00:35 guifa2 left 00:42 guifa2 joined 00:51 guifa2 left 01:03 sena_kun joined 01:05 Altai-man_ left 01:10 Kaiepi joined 01:27 AlexDaniel joined, AlexDaniel left, AlexDaniel joined
Geth nqp: 62b3b791d4 | Coke++ | docs/ops.markdown
document hllboxtype
[Coke] hlllist and hllhash look like they are supposed to be returning type objects, but appear to be returning instances. Is returning an instance the desired behavior? 01:30
m: use nqp; dd nqp::hllhash, nqp::hlllist
camelia Hash element = {}
[Coke] also: what is hllboolfor for? (compared to hllbool) 01:33
01:33 cognomin_ joined 01:37 cognominal left
Geth nqp: 467c158b50 | Coke++ | docs/ops.markdown
Document hlllist, hllhash
nqp: 0f8e71a07c | Coke++ | docs/ops.markdown
whitespace, cleanup
[Coke] ^^ below 300 test failures on the ops docs test.
timotimo isn't it for passing the HLL name? 01:41
hllboolfor(1, "perl6") vs hllboolfor(1, "nqp") or so? 01:42
[Coke] m: use nqp; dd hllboolfor(1,"nqp") 01:48
camelia 5===SORRY!5=== Error while compiling <tmp>
Undeclared routine:
hllboolfor used at line 1
[Coke] m: use nqp; dd nqp::hllboolfor(1,"nqp")
camelia (signal SEGV)
[Coke] m: use nqp; dd nqp::hllboolfor(1,"Raku")
camelia Bool::True
[Coke] m: use nqp; dd nqp::hllboolfor(1,"tcl")
camelia (signal SEGV)
[Coke] that seems bad. :) 01:49
timotimo: Do they *all* take a name? I couldn't get an arg to do anything, and they seem to work without it. 01:50
timotimo no, only the one with "for", if at all
but yeah, it grabs the HLL for the given string, and pulls the true or false value out of it 01:51
[Coke] m: use nqp; dd nqp::hllboxtype_s, nqp::hllboxtype_i, nqp::hllboxtype_n, nqp::hlllist, nqp::hllhash, nqp::hllbool(0), nqp::hllbool(1)
camelia Str
Hash element = {}
timotimo hlllist definitely returns a type. if not, it would have one instance that i s shared with everything
m: use nqp; my $a := nqp::hlllist(); $a.push(1); say $a; my $b := nqp::hlllist(); say $b 01:52
camelia Cannot find method 'push' on 'BOOTArray': no method cache and no .^find_method
in block <unit> at <tmp> line 1
[Coke] quirk of dd that it looks like List.new instead?
timotimo m: use nqp; my $a := nqp::hlllist(); nqp::push($a, 1); say $a; my $b := nqp::hlllist(); say $b
camelia push_o requires a concrete object (got a BOOTArray type object instead)
in block <unit> at <tmp> line 1
timotimo perhaps
Geth nqp: d55e3b70e6 | Coke++ | docs/ops.markdown
fix desc for hlllist, hllhash

03:02 Altai-man_ joined 03:05 sena_kun left
AlexDaniel sourceable6: Channel.new.send(42) 03:25
sourceable6 AlexDaniel, github.com/rakudo/rakudo/blob/ec50...el.pm6#L42
04:22 hungrydonkey joined 05:03 sena_kun joined 05:04 [Coke] joined, [Coke] left, [Coke] joined 05:05 Altai-man_ left 05:55 hungrydonkey left 06:03 guifa2 joined
nine timotimo: I'm super happy with my Kinesis Freestyle 2. Can't imagine using a flat keyboard anymore 06:27
06:38 lichtkind joined 07:02 Altai-man_ joined 07:05 sena_kun left 07:06 hungrydonkey joined 09:03 sena_kun joined 09:05 Altai-man_ left 09:20 MasterDuke left
lizmat timotimo: :fromend sounds nice 10:05
10:18 lichtkind_ joined 10:20 lichtkind left 10:24 squashable6 left 10:25 squashable6 joined
timotimo nine: i'm not sure i'd settle for anything that doesn't run qmk; there are ways to get qmk onto it, but they require adding a new controller and soldering or jumpering 10:33
nine Of....course...even keyboards have firmware 10:34
timotimo i read that the multimedia keys are actually wired up to press key combinations
that's ludicrous, in that case i'd really rather have one completely without them
qmk is the rockbox of keyboard firmwares :D 10:37
lizmat jnthn: re re-precompilation: instead of taking a SHA of the source, maybe we could take a SHA of all signatures / pads and only precompile if those are changed? 10:39
it's not like a change of text in an error message in the core really needs re-precompilation of all installed modules 10:40
in response to www.reddit.com/r/rakulang/comments..._language/ 10:41
timotimo good luck making changes that don't shuffle cuuids around :)
OTOH, if we move to a concept where more stuff starts out as uncompiled and is first interpreted, things like error messages would be harmless to change 10:42
like, all the exception classes
jnthn lizmat: What if the string is part of a constant? 10:44
Or called via BEGIN, or a trait handler, or ends up returned from an EXPORT, or...
lizmat then maybe I don't fully understand the linkage between precomps :-) 10:45
I'm just saying that I know from personal experience working on some larger projects, that having to re-precomp large sets of modules becomes a pain 10:47
and I see more people mentioning that online
I guess one way would be to make parsing faster :-) 10:48
jnthn More of a pain that just waiting for everything to be parsed/compiled every time? :)
lizmat *to deal with that
well, that's the thing
people get spoilt :-)
timotimo kind of makes me want to hack up a tiny patch that prints every time we find a #?line thingie
lizmat remembers the day when re-compiling the core meant having to re-install *all* modules
timotimo so we can see which file from the core takes how long
jnthn Really, compilation needs to be faster.
nine Yeah, in the end, that's what will solve these issues. All the other fancy ideas are really just disctractions 10:51
10:53 hungrydonkey left
timotimo one way to be faster at something is to do less of the thing ;) 11:01
11:02 Altai-man_ joined 11:05 sena_kun left 11:07 hungrydonkey joined
timotimo m: my int @res; @res = (-10e0 .. 10e0)>>.sign 11:15
camelia This type cannot unbox to a native integer: P6opaque, Num
in block <unit> at <tmp> line 1
timotimo m: my int @res; @res = (-10e0 .. -1e0)>>.sign
camelia ( no output )
timotimo m: my int @res; @res = (1e0 .. 10e0)>>.sign
camelia ( no output )
timotimo m: my int @res; @res = (0e0)>>.sign
camelia This type cannot unbox to a native integer: P6opaque, Num
in block <unit> at <tmp> line 1
timotimo ^- i don't like this terribly much
lizmat mL dd 0e0.sign 11:21
m: dd 0e0.sign
camelia 0e0
lizmat hmmm
m: dd 1e0.sign
camelia 1
lizmat m: dd -1e0.sign
camelia -1
lizmat interesting 11:22
timotimo: I'd say that 0e0.sign not being an Int is a bug 11:26
m: +(0e0 cmp 0)
camelia WARNINGS for <tmp>:
Useless use of "+" in expression "+(0e0 cmp 0)" in sink context (line 1)
lizmat m: dd +(0e0 cmp 0)
camelia 0
lizmat m: dd +(1e0 cmp 0)
camelia 1
lizmat m: dd +(-1e0 cmp 0) 11:27
camelia -1
lizmat m: my $v = 0e0; $v.sign for ^100000; say now - INIT now 11:28
camelia 0.03138225
lizmat m: my $v = 0e0; $v.sign for ^1000000; say now - INIT now
camelia 0.0884352
lizmat m: my $v = 0e0; +($v cmp 0) for ^1000000; say now - INIT now
camelia WARNINGS for <tmp>:
Useless use of "+" in expression "+($v cmp 0)" in sink context (line 1)
lizmat hmmm 11:29
timotimo the impl literally returns +self if it's neither <0 nor >0
which i have to imagine is for nan and negative 0
lizmat yup 11:30
changing it to a hard 0 breaks one test
timotimo mhm
lizmat I guess that can be fixed by adding a Num.sign candidate
timotimo so anything Real but not Num will always return Int 0? 11:31
m: say (1+5i).sign
camelia Cannot convert 1+5i to Real: imaginary part not zero
in block <unit> at <tmp> line 1
timotimo m: say (1+0i).sign
camelia 1
timotimo m: say (0+0i).sign
camelia 0
timotimo m: say (0+0i).sign.raku
camelia 0e0 11:32
timotimo that must go through a .Real or perhaps .Bridge somewhere
lizmat the only problem with just making it a hard 0, is the handling of NaN
m: dd NaN.sign
camelia NaN
timotimo then it'd also return "always int but Num if it's NaN" 11:33
:| 11:34
welp, i'm glad we have rats where this is not an issue i guess?
lizmat m: dd (1/3).sign 11:35
camelia 1
lizmat m: dd (0/3).sign
camelia 0.0
11:42 hungrydonkey left 12:05 MasterDuke joined
Geth rakudo: 42a303ecf5 | (Elizabeth Mattijsen)++ | 3 files
Make Real.sign always return an Int

Except when the value was NaN, in which case it will return a NaN. Added candidates for Num (to handle NaN) and Int (to make it almost 2x as fast).
lizmat timotimo ^^
timotimo m: -0e0.sign.say 12:16
camelia WARNINGS for <tmp>:
Useless use of "-" in expression "-0e0.sign.say" in sink context (line 1)
timotimo m:say -0e0.sign
evalable6 -0
timotimo this won't stay, then? 12:17
lizmat nope, should it ?
timotimo not sure actually
lizmat m: dd -0e0.sign 12:18
camelia -0e0
lizmat I mean, Int doesn't have a representation for -0
timotimo true
m: say -0e0 < 0e0
camelia False
timotimo m: say -0e0 == 0e0
lizmat docs.raku.org/routine/sign states -1 0 1 as the possible values
camelia True
[Coke] m: say (-0e0).sign 12:19
camelia -0
lizmat in any case, there is no test for the behaviour of -0e0.sign
timotimo i'm not knowledgable enough in the intricacies of ieee floating point to make a reliable suggestion here
lizmat I mean, usually you use .sign as a multiplication factor for something 12:20
in any case, the commit was spectest clean 12:21
as usual, my commits can be reverted
timotimo hopefully we'll coax someone out of their hidey-place to tell us if it's wrong 12:22
lizmat if they are deemed to be not acceptable
Oh, I'm sure my commits are being watched :-)
timotimo but who commits the watchers?
lizmat well, they only need to be committed in very rare cases 12:25
AlexDaniel timotimo: `say -0e0.sign` doesn't do what you think 12:26
timotimo yes, but coke corrected it later on 12:27
AlexDaniel although, yeah, if it returns a num then I guess it does anyway…
6c: dd (-0e0).sign 12:28
committable6 AlexDaniel, gist.github.com/5fd1c1a97183a3de31...14c11c9bd6 12:29
AlexDaniel Altai-man_: ↑ something you should know about (I dunno if it's an issue or not)
lizmat fwiw, I was surprised to see that .sign did not always return an Int 12:30
(well, except in the case of NaN)
Altai-man_ AlexDaniel, will see how blin will be next weekend. 12:31
AlexDaniel lizmat: what about Complex? 12:32
ah, it can't do that
lizmat complex can't coerce to a Real if it has an imaginary component
timotimo there is no concept of "less than" or "greater than" for complex numbers 12:33
since we define sign based on comparison against 0, that doesn't
m: dd NaN.sign 12:37
camelia NaN
AlexDaniel m: dd (0/0).sign
camelia 0
AlexDaniel c: HEAD~10 dd (0/0).sign
committable6 AlexDaniel, ¦HEAD~10: «<0/0>␤»
AlexDaniel c: HEAD~10,HEAD dd (0/0).sign
committable6 AlexDaniel, ¦HEAD~10: «<0/0>␤» ¦HEAD(42a303e): «0␤» 12:38
AlexDaniel I guess that's better
timotimo now that is wrong for sure
the 0/0 one
AlexDaniel is it?
timotimo not sure if 0 is much better
lizmat bisectable6: dd (0/0).sign
bisectable6 lizmat, Bisecting by output (old=2015.12 new=42a303e) because on both starting points the exit code is 0
lizmat, bisect log: gist.github.com/348aee11da64fa40cc...b1750995e8
lizmat, (2020-04-22) github.com/rakudo/rakudo/commit/42...719c08a417
AlexDaniel I mean, 0/0 doesn't immediately explode, it's just a Rat
timotimo yeah
m: say 0/0 < 1; say -1 < 0/0 12:39
camelia False
timotimo m: say 0/0 > 1; say -1 > 0/0
camelia False
AlexDaniel hmm…
yeah I guess passthrough is somewhat better because it will likely explode later
timotimo m: say 0/0 >= 1; say -1 >= 0/0; say 0/0 <= 1; say -1 <= 0/0
camelia True
timotimo m: say 0/0 == 1; say 0/0 == 2
camelia False
AlexDaniel or maybe it won't :D 12:40
timotimo is that what you get when you define <= as "not >"?
AlexDaniel freaking rats
lizmat: this got me thinking 12:43
lizmat: if the whole situation with .. and … are such a trainwreck 12:44
lizmat: then surely, surely, count-only logic is definitely wrong all over the place 12:45
first try:
m: say +((5..2).reverse)
camelia -1
AlexDaniel negative amount of elements?
lizmat m: say +(5..2)
camelia 0
lizmat m: say (5..2).reverse 12:46
camelia ()
lizmat hmmm
AlexDaniel s/are/is/
lizmat m: say (5..2).elems
camelia 0
lizmat m: say (5..2).reverse.elems
camelia -1
[Coke] so, just guessing on a lot of ops in the documentation tests. looks like we have references to if_i (and a bunch of similar ones like unless_s) - can someone point me at where those are defined? (trying to do better at catching the "non-standard" definitions and also doc them. looks like it's just a variant where we get a simple obj of that type rather than a block) 12:47
AlexDaniel lizmat: at least its sum is zero…
lizmat I guess the count-only n NativeIntReverse is off-by-one 12:48
AlexDaniel lizmat: fwiw you don't need .reverse 12:50
m: say +(5..-∞)
camelia 1
12:50 sena_kun joined
AlexDaniel then this one is an infinite range: 12:50
lizmat AlexDaniel: please file an issue :-)
AlexDaniel m: say (-∞..-∞)[^10]
camelia (-Inf -Inf -Inf -Inf -Inf -Inf -Inf -Inf -Inf -Inf)
AlexDaniel but
m: say +(-∞..-∞)
camelia NaN
lizmat you're saying that should be Inf ?
not 2x Inf ? :-) 12:51
[Coke] (guessing) on finding the definition, that is, using some hueristics to know if an op exists in a particular backend.
AlexDaniel lizmat: it should be the same as counting the elements
12:51 Altai-man_ left
AlexDaniel lizmat: if it keeps generating elements forever then yeah, it should probably give an Inf 12:52
alternatively it can hang, I don't mind
timotimo when do we systematically put all special reals into all our math operators 12:53
to double-check if everything looks okay
... not volunteering :P
AlexDaniel lizmat: I won't be filing an issue though 12:54
maybe I should've made one will *all* of the bugs I found in .. ...
lizmat doesn't understand why looking up all of the mistakes of something should not result in an issue 12:55
lizmat is working on a re-implementation of ... in github.com/lizmat/Sequence-Generator 12:56
AlexDaniel it should, yeah
but I don't know where to even start
I also don't think I'm capable of covering all of the cases 12:57
so somebody has to do this work anyway
12:57 cognominal joined 13:00 cognomin_ left
AlexDaniel lizmat: thing is, pretty much any edge case I touch is weird or wrong 13:02
I might as well file a ticket saying “count-only gives a wrong result”
lizmat "it's wrong, please fix it"
AlexDaniel yeah, and you prove that it's fixed for all edge cases 13:03
and if you can't, then it's likely still wrong :)
m: .say for (0^..^0)'
camelia 5===SORRY!5=== Error while compiling <tmp>
Two terms in a row
at <tmp>:1
------> 3.say for (0^..^0)7⏏5'
expecting any of:
infix stopper
AlexDaniel m: .say for (0^..^0)
camelia ( no output )
AlexDaniel so that thing has no elements
m: say +(0^..^0) 13:04
camelia 0
AlexDaniel count-only is right
m: say ?(0^..^0)
camelia True
AlexDaniel but what is bool-only even doing here?
6c: say ?(0^..^0) 13:05
lizmat not the right thing ?
committable6 AlexDaniel, ¦6c (42 commits): «True␤»
AlexDaniel does it ever give anything but True? 13:06
I mean, if you .reverse it, then surely it does:
m: say ?((0^..^0).reverse)
camelia False
AlexDaniel lizmat: R#3637 R#3639 13:17
linkable6 R#3637 [open]: github.com/rakudo/rakudo/issues/3637 [ranges] .count-only on Ranges is wrong (say +(5..-∞))
R#3639 [open]: github.com/rakudo/rakudo/issues/3639 [ranges] .bool-only on Ranges is wrong ( ?(0^..^0) )
lizmat AlexDaniel++ 13:20
AlexDaniel lizmat: and there goes my idea of being able to find the ticket easily :D 13:31
anyway, lizmat++
sourceable6: (0^..^0).reverse.count-only() 13:39
sourceable6 AlexDaniel, No idea, boss. Can you give me a Code object? Output: No such method 'count-only' for invocant of type 'Seq'␤ in block <unit> at /tmp/mdMfGPvXoe line 1␤␤
AlexDaniel sourceable6: (0^..^0).iterator.count-only()
sourceable6 AlexDaniel, github.com/rakudo/rakudo/blob/42a3....pm6#L2017
lizmat jnthn: do we assume SlippyIterator is an implementation detail or not ? 13:55
jnthn Sounds like one to me 13:56
lizmat then we should probably call it Rakudo::SlippyIterator 14:00
AlexDaniel lizmat: what's the meaning of push-* methods in IntRange? 14:03
ahh I see a comment above 14:04
lizmat they are part of the Iterator interface that *can* be implemented for better performance 14:05
14:17 MasterDuke left 14:22 AlexDaniel left 14:35 MasterDuke joined
nine [Coke]: not sure I understand your question. if_i for example is github.com/MoarVM/MoarVM/blob/mast...erp.c#L279 14:39
[Coke]: if_i, unless_i, if_n, ... are low level branching ops. They can't take a block as that doesn't exist anymore in the bytecode level. It takes a truth value in the form of an int, num or string and if true, jumps to the given label 14:40
[Coke]: the label is just an offset into the bytecode 14:41
[Coke] my question: where is the logic for "if_i" defined? 14:43
the doc test is complaining about if_i, but it looks like there are other variants that the doc test is *not* complaining about, want to be able to report on them more accurately (and then document them, which you've helped with there.) 14:44
14:49 Altai-man_ joined 14:51 sena_kun left 15:04 lucasb joined
timotimo m: .say for (-1, 0, 1, NaN)>>.Int 15:32
camelia -1
Cannot convert NaN to Int:
in block <unit> at <tmp> line 1

timotimo m: dd (-1, 0, 1, NaN)>>.Int 15:34
camelia (-1, 0, 1, Failure.new(exception => X::Numeric::CannotConvert.new(target => Int, reason => Any, source => NaN), backtrace => Backtrace.new))
timotimo m: dd my @foo = (-1, 0, 1, NaN)>>.Int
camelia Array @foo = [-1, 0, 1, Failure.new(exception => X::Numeric::CannotConvert.new(target => Int, reason => Any, source => NaN), backtrace => Backtrace.new)]
timotimo m: dd my int @foo = (-1, 0, 1, NaN)>>.Int
camelia This type cannot unbox to a native integer: P6opaque, Failure
in block <unit> at <tmp> line 1
timotimo m: say NaN // 1 15:46
camelia NaN
timotimo m: say NaN || 1
camelia NaN
timotimo m: say NaN min 1; say NaN max 1
camelia 1
16:00 softmoth joined 16:07 AlexDaniel joined, AlexDaniel left, AlexDaniel joined
timotimo greppable6: \>\>.*\<\< 16:13
greppable6 timotimo, 271 lines, 46 modules: gist.github.com/df7962efcc6aa42e6c...74092bd0a6
Altai-man_ .oO ( \>\>.*\<\< is a cool nickname to use ) 16:14
timotimo huh, the table breaks at one point in the middle 16:15
16:16 scovit joined
scovit timotimo: it is worring that NaN doesn't propagate 16:17
timotimo yeah, i think that's generally the expectation 16:18
anything that touches NaN becomes NaN
scovit: do you happen to know some examples where you would hyperop some native int/num arrays together into another int/num array? 16:19
scovit timotimo: you mean things like calculating the scalar product of two arrays of vectors 16:22
matrix-vector multiplication 16:23
timotimo that'd be a cross and a reduce, right?
scovit yes 16:24
timotimo i'm only working with >>+<< shaped hyperops as well as a small set of >>.foo methods 16:25
but if the result of a Z or X gets assigned into a native array, the lazyness will immediately be discarded / eagerly evaluated, so it could also go in there right away
i kind of also want to support @bloop >>*>> |(1, 2, 4, 8) xx * 16:26
16:26 lichtkind_ left
scovit fourier transform comes to my mind 16:26
timotimo though i have no idea if anybody will ever need something like that
you'd be a fool to implement a fourier transform yourself instead of going with, for example, fftw 16:27
or maybe there is a good reason
scovit yep
on the other end, you can never predict what people will use them for 16:28
timotimo true for sure 16:29
scovit I think it is useful to have them fast, combined with fast reduction they can be very useful for data anlysis
timotimo phew, add reduction to the mix, too, hmm
i also want to support @a >>+<< @a.reverse 16:31
and - stop me if that sounds terrible - grep 16:32
scovit that seems more difficult since the size of grep return is not known in advance 16:33
timotimo as soon as i go away from "native arrays only", there'd have to be loads of checks that whatever's coming in would behave the way i implemented it myself
that's right, there'll have to be run-time size checks there
m: .say for ^100.grep(*.is-prime) <<+<< ^10 16:34
camelia Potential difficulties:
Precedence of ^ is looser than method call; please parenthesize
at <tmp>:1
------> 3.say for ^1007⏏5.grep(*.is-prime) <<+<< ^10
timotimo m: .say for (^100).grep(*.is-prime) <<+<< ^10
camelia 2
timotimo ^- another way to handle different sizes
Altai-man_ timotimo, sorry if I'll write some dumb thing right now, but I think you can just put up any synthetic examples which cover what you want, even not really useful, and if you can make them hella faster, then every "real world" usage will became faster as a consequence. Or I am not getting something?
timotimo hmmm 16:35
Altai-man_ I mean, if you are making e.g. an addition in a loop faster, you don't really need a real world application of number additions, people will find ways to utilize them.
Of course, knowing the domain helps a lot.
timotimo maybe what i'm after is mostly a motivational example and/or something that'll give me a priority what to work on next 16:36
Altai-man_ If you know what implications from the user code may be, that's really helpful to know about, but sometimes a loop is a loop.
MasterDuke github.com/moritz/Math-RungeKutta could use it, right? 16:38
16:39 lucs is now known as pel
MasterDuke looks like there are a couple other things in greppable6's results 16:39
timotimo i've seen an example in there
yeah most of the results are false positives, some from Q<<blah>>, Q<<blah>>
and some from pod 16:40
16:40 pel is now known as lucs
MasterDuke pierre-vigier/Perl6-Math-Matrix, skids/perl6sum, skinkade/p6-crypt-argon2 16:40
timotimo .o( linkable please? ) 16:44
[Tux] Rakudo version 2020.02.1-343-g42a303ecf - MoarVM version 2020.02.1-107-gab089e947
csv-ip5xs0.880 - 0.920
csv-ip5xs-208.849 - 9.371
csv-parser24.954 - 27.082
csv-test-xs-200.397 - 0.398
test7.645 - 7.947
test-t1.978 - 2.013
test-t --race0.825 - 1.002
test-t-2032.938 - 35.455
test-t-20 --race9.766 - 10.149
I did not post a few days as I was struggling with a VPN that took 200% CPU where it should be 0.2%
nine Wait a minute! Since when is csv-ip5xs-20 so slow?
[Tux] now that that is fixed, I feel comfortable in running timings again
timotimo our sub add(@a, @b){ my @sum = clone(@a); for ^@a.elems -> $row { @sum[$row] = @sum[$row] <<+>> @b[$row] }; @sum; } 16:49
16:50 sena_kun joined
timotimo i'm not going to catch any of that, since currently i bail out if arrays are not declared locally to be native-typed 16:50
[Tux] nine, tux.nl/Files/20200422185137.png 16:51
16:51 Altai-man_ left
nine Points at version 0.47. Will have to do some testing 16:53
[Tux] ping me if you want specific tests, though I am not always present 16:55
timotimo MasterDuke: Sum's readme starts like "Very broken at the moment" :D 16:57
AlexDaniel sena_kun: soo can you update Blin again? 17:00
sena_kun: so that the next run is with the recent changes 17:01
sena_kun let's see...
timotimo hmm. supporting `($a, $b, $c) >>+&<< ($x, $y, $z)` just to give `($a +& $x, $b +& $y, $c +& $z)`
sena_kun AlexDaniel, started building of new image. 17:03
jdv79 nine: i've used kinesis freestyle keyboards pretty much exclusively for over a decade 17:22