🦋 Welcome to the IRC channel of the core developers of the Raku Programming Language (raku.org #rakulang). This channel is logged for the purpose of history keeping about its development | evalbot usage: 'm: say 3;' or /msg camelia m: ... | Logs available at irclogs.raku.org/raku-dev/live.html | For MoarVM see #moarvm
Set by lizmat on 8 June 2022.
00:00 reportable6 left 00:01 reportable6 joined 00:23 epony left 00:49 epony joined 01:22 rypervenche joined 01:53 MasterDuke joined
tonyo patrickb: registered 02:38
06:00 reportable6 left 06:03 reportable6 joined
Geth nqp/main: 510e0508c5 | (Christian Bartolomäus)++ | t/nqp/063-slurp.t
Mark t/nqp/063-slurp.t as self-referential

Also, there is no need to accept two numbers as the number of chars anymore. With 0412c22303 the JVM backend learned to count a CRLF as one char as well. So even if the test file would be written with CRLF as line endings, nqp::chars should give back the same number as for LF as line endings.
This should fix github.com/Raku/nqp/issues/512.
nqp/main: 4250c96550 | niner++ (committed using GitHub Web editor) | t/nqp/063-slurp.t
Merge pull request #799 from usev6/gh_512

Mark t/nqp/063-slurp.t as self-referential
09:08 ab5tract joined 09:30 sena_kun joined
ab5tract I think I've found an (the?) issue with the WhateverCodes not evaluating for subsets 10:14
Could it be related to 'TODO implement other thunk types' in IMPL-THUNK-ARGUMENT?
Specifically what I'm investigating is why a bind to lexical '$whatevercode_arg1' is missing from the QAST in the rakuast branch 10:16
AFAICT it should both have a 'QAST::Var(lexical $whatevercode_arg1)' as well as a bind to the local decont var .. both are missing 10:17
lizmat that feels to me you're on to something 10:39
nine Running code at BEGIN time is just an endless source of joy. So any code run at BEGIN time wants access to the lexical environment it was defined in, e.g. `my $foo; BEGIN $foo = "foo";` But at the time that BEGIN statement runs, the frame that the $foo lexical is defined in does not yet exist. 11:11
The old frontend solved this by creating a wrapper frame containing all lexicals that should be visible from the code. This includes all symbols of the setting, so these frames were huge!
In the RakuAST frontend we replaced that wrapper frame with a new mechanism that allowed for a call back from the runtime to the compiler, so it could resolve such symbols on demand. This is already working. 11:12
ab5tract hmmm
nine Now one problem still persists, and I think it's something that wasn't even solved conciously in the old frontend but was just a side effect of having that wrapper frame:
When we compile a code block dynamically, this block may contains nested blocks. E.g. a role body (which is also a code block, run at compile time when the role gets composed into a class) will contain methods. 11:13
We replace the $!do attributes of such nested code objects which at that time still point to stubs with the actual compilation result, e.g. the bytecode frames. But these frames have a lexical environment which in the old frontend was the wrapper frame. But in the new frontend that wrapper doesn't exist. 11:14
Instead their outer frame will still be the comp unit we generated and this comp unit contains the callback to run on missing lexicals. 11:15
ab5tract Just to clarify, do you think this relates to my current issue? 11:23
nine no 11:28
ab5tract ok, I didn't see the connection there but just wanted to double check 11:30
That's an interesting quandary
lizmat added a problem solving issue: github.com/Raku/problem-solving/issues/365 11:40
Nemokosch and a pretty well-aimed one, too 11:46
Geth rakudo/main: 34cf82aa16 | (Will Coleda)++ (committed using GitHub Web editor) | 2 files
Add Complex.sign to v6.e
Nemokosch > When we currently run a spectest, it is done with the CURRENT state of v6.d, which is not what the next version will be. We should have an easy way to run the spectests for a specific version of Raku perhaps I failed to express myself well but that's almost the same thing I tried to ask like a week ago 11:48
how the spectests relate to language versions
lizmat well, I guess that somehow stuck in my subconscious :-)
and just having worked a lot on RakuAST and stuff... 11:49
Nemokosch wait, is it actually an N:M situation? Version of specification X version used by the compiler
where preferably the Z pairs should work 🙂 11:50
lizmat the problem is that there shouldn't be *any* version specification in the test files in general, I think 11:51
except for the ones that are testing features that have been deprecated / removed in later versions 11:52
Nemokosch okay, I think this is an important exception still - because this implies a certain design of the specification 11:53
lizmat so a file that specifies 6.c implies that it should only work on 6.c
Nemokosch is there a convenient way to say in a test - "pass the whole file if version doesn't match"? 11:54
"match" could be understood broader, even
lizmat nope, which is another issue, I guess
Nemokosch "only run this in c AND d", for example
or "from e onwards"
lizmat well, the spectest.data file is frozen on language version release 11:55
Nemokosch oh, so that's the file JJ mentioned, I suppose
the file that decides what tests are "active" 11:56
lizmat yup 11:59
and some meta-info for the test runner
12:00 reportable6 left 12:02 reportable6 joined
Geth rakudo/lizmat-more-complex: 67de08d7b5 | (Elizabeth Mattijsen)++ | 6 files
Make log and sqrt handle negative values mathematically correct

  - in 6.e only
  - make sqrt a multi
  - add a new sqrt candidate handling negative values
  - add a new log candidate handling negative values
Note that the use of "is default" in these new candidates is needed to resolve dispatch ambiguities. This is really a stopgap measure for now, hopefully we can dispatch on language version soon!
rakudo: lizmat++ created pull request #5192:
Make log and sqrt handle negative values mathematically correct
lizmat Funny thing on the way to the forum: 13:07
the TEMP phaser is *not* documented, but has TODOd tests
it's basically just a stub in the grammar with no action associated with it 13:08
the COMPOSE phaser *is* documented as NYI, but doesn't have tests
yet the code that supposedly needs to tell you that it is NYI, doesn't fire
m: COMPOSE say "foo" 13:09
camelia ( no output )
lizmat m: role A { COMPOSE say "foo" }; A.new
camelia ( no output )
Geth rakudo/lizmat-lose-compose: daaa304dc5 | (Elizabeth Mattijsen)++ | 3 files
Eradicate knowledge of COMPOSE phaser

There were some speculations, and an attempt at creating a stub that was supposedly create a NYI error, but didn't. Meanwhile, the mainline of a role is run every time it gets composed into a (new) class, so effectively we already *have* an implicit COMPOSE phaser. So there's no need for a COMPOSE phaser, it appears.
rakudo: lizmat++ created pull request #5193:
Eradicate knowledge of COMPOSE phaser
lizmat meh, it picked up something it shouldn't have :-(
Geth rakudo/lizmat-lose-compose: fe90d50b2e | (Elizabeth Mattijsen)++ | 6 files
Revert "Make log and sqrt handle negative values mathematically correct"

This reverts commit 67de08d7b533424dc2b0850895db30a7e28209d8.
lizmat afk for a few hours& 13:40
ab5tract lizmat++ # removing a phaser ... my mind was boggling yesterday looking at all the extant phaser options 13:58
so many phasers, and even one that is different based on whether it is in a supply or a loop 13:59
Nemokosch Is it right for the RakuAST variable node to report type "Int" for my Int &foo? 14:58
I'd think it is, just making sure. Perhaps the actual type needs to be handled at container level
ab5tract what are you working on, out of curiousity?
Nemokosch I'd like to see the named call to generate the right defaults, and probably metadata in general 15:01
it's inspired by a persisting tiny issue with the current system that itches me a lot
namely that my Int &foo has the type Callable[Int] but the default value of Callable, hence failing its own type check if you want to reset the value 15:02
now, this is NYI with the new frontend
my Int &foo is simply a Scalar, with an Int type
ab5tract ah, ok. all above my pay grade I'm afraid 15:03
in fact, I feel like I'm losing my mind since I started working in RakuAST ;) 15:04
Nemokosch it might be a lot easier than what you're working with, it's "world-scoped" development mostly
the generated AST itself looks fine, so does the QAST
that's why I want to make sure this assumption is correct, so that I don't go in the wrong direction 15:05
but I'd hope that I'm really close with metamodel stuff
ab5tract Why on earth is it the case that '* ~~ 5' successfully installs a lexical in QAST and binds that lexical to the lowered decont var, whereas 'subset F where * ~~ 5' has no lexical "$whatevercode_arg1" in QAST and is not bound 15:06
what kind of variable node is it? a declaration or a lookup? 15:07
^ Nemokosch
Nemokosch declaration 15:08
I'd think that's where the container is decided
ab5tract hmm, I don't see any special consideration for '&' as a sigil in the var declaration code 15:20
Nemokosch and that's probably the reason it acts exactly like '$' 😄 15:21
ab5tract :) 15:45
nine: sorry to bother you so much, but it really is driving me a bit crazy. Any thoughts on why a bare WhateverCode is getting attached lexically and bound to lowered arg but when neither happens in the case of being wrapped by the logic shared by subset and signature? 15:51
nine Would need to have a closer look for which I don't have the time right now 15:52
ab5tract okay, no worries
16:34 camelia left, nine left 16:35 nine joined 16:38 nine left 16:40 camelia joined, nine joined
ab5tract What's driving me particularly batty is that the lexical definition for '$whatevercode_arg_1' is "QAST::Var(lexical $whatevercode_arg_1 :decl(contvar)) " .. but I can find nowhere in the source where a QAST::Var is created that is both lexical and contvar! 17:08
Outside of VarDeclaration::Implicit::Special, that is
Ah... 17:23
Another place where it is possible is ParameterTarget::Var 17:24
which does not get its IMPL-QAST-DECL called when our whatevercode is in a subset or a signature where clause 17:25
. o O ( I really wish 'caller' would be available in NQP land ) 17:28
17:30 Xliff joined
Xliff Is the QAST generation for RakuAST::Parameter complete? 17:46
patrickb The GSoC application is up. Now we have to wait for feedback from Google whether we are accepted. 17:54
Nemokosch very much appreciated ^^ 17:59
tonyo i don't work in perl or raku (or with people too interested in either), do we have any mentees seeking mentors?
Xliff gist.github.com/Xliff/b228b05633ac...d6502c7a06
18:00 reportable6 left 18:01 reportable6 joined
patrickb tonyo: It's too early. We'll have to wait for the call for students. Here's a timeline: developers.google.com/open-source/gsoc/timeline 18:06
18:09 nine left 18:10 nine joined
ab5tract Xliff: I don't think it can be considered complete if its IMPL-QAST-DECL is not called. But its only this last stage of defining the lexical and binding it to the lowered var that is different between base QAST and RakuAST 18:52
Xliff ab5tract: So do you think this patch will work: gist.github.com/Xliff/b228b05633ac...d6502c7a06 19:10
Which I need for something else.
19:10 epony left 19:11 epony joined
lizmat Xliff: not sure what you need? 19:13
Xliff I need RakuAST::Parameter to properly .DEPARSE parameter literals. 19:20
Ala « multi sub a("Bee") { say "Cee" } » 19:21
lizmat the code lives in src/core.c/RakuAST/Deparse.pm6 :-) 19:22
Xliff: I could try to fix by example, do you have some examples that don't deparse correctly ? 19:23
nine ab5tract: when I want to know how we got at a certain place in the code I just add an nqp::die('here') with maybe a condition. 19:30
tonyo nine++
nine This weekend, in addition to nqp::bindhllsym('nqp', 'note', &note); I also added this to nqp/src/core/IO.nqp: nqp::bindhllsym('nqp', 'cluck', -> $message { nqp::die('here'); CATCH { nqp::gethllsym('nqp', 'note')($message ~ nqp::join("\n", nqp::backtracestrings($_))) } }); 19:31
With this nqp::gethllsym('nqp', 'cluck')('This is how we got here') prints that message with a backtrace 19:32
Xliff: I wouldn't consider anything complete. I only ever write code for fixing a specific test I'm after. Otherwise I rarely know what the desired behaviour actually is. 19:33
lizmat Xliff: re "sub a("Bee") { }" looks like the deparse is not the issue, it doesn't even parse yet! 19:35
m: Q|sub a("Bee") { }|.AST 19:36
camelia ===SORRY!===
No such method 'compile-time-value' for invocant of type
nine sub a(1) { } does
lizmat m: Q|sub a(42i) { }|.AST
camelia ===SORRY!=== Error while compiling
Missing block
------> sub a⏏(42i) { }
lizmat m: Q|sub a(<42i>) { }|.AST 19:37
camelia ===SORRY!=== Error while compiling
Missing block
------> sub a⏏(<42i>) { }
lizmat m: Q|sub a(42e0) { }|.AST
camelia ( no output )
lizmat hmmm
so maybe this is low-hanging fruit :-)
nine I think it is 19:41
ab5tract: that QAST::Var must be from the ParameterTarget::Var
ab5tract nine: Yup, I agree. Just can't seem to figure out why its IMPL-QAST-DECL only gets called for the non-wrapped WhateverCode 19:43
Xliff m: Q|sub a ("bee") { 1 }|.AST 19:52
camelia ===SORRY!===
No such method 'compile-time-value' for invocant of type
Xliff That's odd. This was working 2 or so weeks ago when I originally asked this question. 19:53
lizmat Xliff: I'm on it, fixing deparsing now :-) 19:54
Xliff lizmat++ -- Thank you SO MUCH! 19:55
Once this gets in, I can now make Cro handlers from method definitions. 19:57
No more hand coded route blocks!
lizmat whee!
20:01 NemokoschKiwi joined
lizmat fixed deparsing now, working on making a test 20:23
nine ab5tract: I fear I don't understand your problem. Would need more info on what you see exactly in what situation and what you would expect instead 20:25
ab5tract nine: I've boiled it down a bit further. For some reason the ApplyInfix object doesn't have any thunks associated when it has been wrapped 20:27
when it is bare, it has a thunk and we call IMPL-THUNK-CODE-QAST on that thunk
nine What do you mean by wrapped? 20:28
ab5tract this eventually leads to IMPL-QAST-DECL being called on the ParameterTarget::Var
both subset and signatures wrap the expression in a block
effectivaly making it '{(* ~~ 5).ACCEPTS($_).Bool}' 20:31
lizmat Xliff: still working on making a test :-) 20:38
ab5tract nine: here's a gist of the QAST -- gist.github.com/ab5tract/3abeadf95...28c249db02 20:44
nine ab5tract: I wouldn't be surprised if ApplyPostfix' PERFORM_BEGIN's handling of currying were utterly broken. 20:45
It looks like the implementation in PerformInfix before I actually got that right...or at least less broken
ab5tract PerformInfix? 20:48
nine er... ApplyInfix 20:49
m: Q|(*.abs.say)(-5)|.AST 20:50
camelia ( no output )
nine m: use MONKEY-SEE-NO-EVAL; EVAL Q|(*.abs.say)(-5)|.AST
camelia 5
nine m: use MONKEY-SEE-NO-EVAL; EVAL Q|((* + 1).abs.say)(-5)|.AST
camelia No such method 'abs' for invocant of type 'WhateverCode'
in block <unit> at <tmp> line 1
nine Yeah, it only handles the most basic case of applying a postfix (e.g. a method call) to a curried expression. 20:51
Geth rakudo/main: 156fc2cfa1 | (Elizabeth Mattijsen)++ | 4 files
Add support for literal string as a parameter

  - QuotedString needed special handling
  - adapted deparsing for literal values
  - made the RakuAST::Parameter.$!value attribute public
  - added test
Feels to me that the RakuAST::Parameter object is overkill for literal Parameters: I think a Parameter::Literal object that would just have a $!value would also work. Will investigate...
lizmat which brings us to: 666 / 1355 !
nine That's how your variable disappears. You wrap the expression in an ApplyPostfix which will then UNCURRY the expression and try to re-curry, but does a really bad job at it
lizmat: we should freeze everything there :D
lizmat m: my $a = 42; sub a("$a: foo") { } # heh, wondered how that would work now :-) 20:57
camelia ===SORRY!===
Cannot find method 'compile_time_value' on object of type QAST::Op
lizmat m: Q|my $a = 42; sub a("$a: foo") { }|.AST 20:58
camelia ===SORRY!===
No such method 'compile-time-value' for invocant of type
lizmat m: Q|my $a = 42; sub a("$a: foo") { }|.AST 21:01
camelia ===SORRY!===
No such method 'compile-time-value' for invocant of type
lizmat I guess camelia needs some time to catch up
will say: Could not get a literal value of a quoted string as a parameter 21:02
when camelia is up-to-date
21:05 NemokoschKiwi left
ab5tract nine: why does it want to uncurry the expression? 21:05
lizmat afk& 21:07
ab5tract also -- worse news.. I special-cased RakuAST::ApplyInfix in subset's PERFORM-BEGIN wrapping code, delivering it without the ApplyPostfix stuff. 21:08
now the QAST matches the "bare" WhateverCode and yet... it still doesn't work (ie, assigning a subset that doesn't meet the criteria will erroneously succeed) 21:11
21:25 melezhik joined
nine ab5tract: it wants to uncurry because e.g. you want (* + 1).abs.say to compile to {($_ + 1).abs.say}, but we process from inner-most to outer-most, i.e. (* + 1).abs.say becomes ({$_ + 1}).abs.say becomes {($_ + 1).abs}.say becomes {($_ + 1).abs.say} 21:32
Uncurrying the operand and then currying again was my attempt to get this done, but as I discovered later, at least my ApplyInfix implementation was far too simplistic. And now we know that ApplyPostifx' is also. 21:33
21:34 melezhik left
nine So, either you attach ApplyPostifx first, or you only test subsets with code blocks instead of curried expressions 21:34
ab5tract yeah, understood. the special casing for ApplyInfix was to see what would happen. and, depressingly, it fixed QAST to look exactly like that generated by the old frontend AFAICT. And yet, it still doesn't work 21:39
22:07 sena_kun left
Xliff lizmat++ # Looks to be working. Many, many, many thx 22:18
22:18 Xliff left
ab5tract I think I found a corner case where my code does better than the old frontend in handling subsets 23:20
m: subset F where * && 5; say my F $f = True 23:21
camelia Type check failed in assignment to $f; expected F but got Bool (Bool::True)
in block <unit> at <tmp> line 1
ab5tract m: subset F where { $_ && 5 }; say my F $f = True
camelia True
ab5tract Ah, nevermind. It's not fixed on my branch, but it's interesting that this example is broken in the old compiler. 23:22
erm, frontend 23:23
23:35 ab5tract left