🦋 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, reportable6 joined
Geth rakudo/main: 0d1444d267 | (Elizabeth Mattijsen)++ | src/Raku/ast/resolver.rakumod
Fix spelling error and formatting in comment
rakudo/main: 14923ccb43 | (Elizabeth Mattijsen)++ | src/Raku/Actions.nqp
Make sure the RakuAST::Pragma class is known

  "no strict".AST would fail before this
02:25 jjatria left 02:36 jjatria joined 03:15 coverable6 left, djinni` left, japhb left 03:27 coverable6 joined, djinni` joined, japhb joined 06:00 reportable6 left 06:03 reportable6 joined
nine Nemokosch, you aware of --ll-exception? 07:17
Nemokosch I heard the name but perhaps not consciously aware 08:27
nine Just wanted to mention: I just had an introduction call with a new colleague and told him about my involvement with Raku and he said that our website looks very nice and he really liked Camelia :) 08:28
Nemokosch, just run rakudo with that and get the full backtrace on any exceptions thrown during compilation and later :)
Nemokosch That sounds cool 💪 thank you 08:29
Geth nqp/main: d19ece2409 | (Elizabeth Mattijsen)++ | tools/templates/MOAR_REVISION
Bump NQP to get MoarVM optimizations
rakudo/main: 250b43347a | (Elizabeth Mattijsen)++ | tools/templates/NQP_REVISION
Bump NQP to get MoarVM optimizations
lizmat bare startup of raku from 0.12 to 0.11 on the M1Mini of yours truly
nine: looking at gist.github.com/lizmat/a61f90d5699...e1-txt-L23 09:52
do you see a thinko in the approach on getting "no strict" to work ?
the idea is to simply replace a Var::Lexical by a VarDeclaration::Simple 09:53
m: use MONKEY; EVAL Q|sub a() is raw { our $x }; a() = 42; say OUR::<$x>|.AST 09:56
camelia 42
lizmat so, the VarDeclaration::Simple does return a container
ab5tract In a statement list, if QAST bind mentions a lexical variable before a QAST::Var has declared that lexical variable, does it just silently fail to bind? 10:00
or does it somehow still bind to the lexical even if the lexical definition comes afterwards? 10:02
nine lizmat: except for that final $declaration.resolve-with($*R); it may just work 10:04
lizmat you mean it doesn't need to be resolved? 10:05
lizmat tries 10:06
nine ab5tract: I think that's fine. The list of lexicals is a property of the frame, so there is no connection to the place in the QAST where it's declared (other than in which scope)
ab5tract ok, great to know thanks
nine It can't be resolved as RakuAST::VarDeclaration::Simple is no RakuAST::Lookup
lizmat aha! ok 10:07
nine lizmat: but you may need a call to $*R.declare-lexical so the compiler knows that lexical from then on 10:09
lizmat: the actions for variable_declarator does that call, but you are in variable access 10:10
lizmat calling it with the $declaration just made, right ? 10:14
nine yes 10:15
lizmat no strict; $x = 42 now dies with Died with X::Assignment::RO 10:17
no strict; $x; say OUR::<$x>:exists # False, in base gives True 10:18
evalable6 WARNINGS for /tmp/jnyhZiWEe_:
Useless use of $x in sink context (line 1)
lizmat I guess it doesn't actually create the container in OUR:: now, because there's no place where the QAST for that is generated now 10:25
nine: so I guess the declaration needs to be hooked up into QAST generation somehwo 10:26
nine: updated the gist gist.github.com/lizmat/a61f90d5699...692f1390c3 10:53
basically, added a "set-declaration" method to Var::Lexical
that will produce the QAST of the declaration just before producing the QAST of the access 10:54
verified that the declaration.IMPL-QAST-DECL is being run, yet still no go :-(
nine I wouldn't muddy the waters any further. There are already a few things that are declaration and access in one and things get quite complicated there. 10:58
lizmat agree... it was more a prove of concept :-)
nine I'd still try to get your original approach of replacing the access with the declaration going.
lizmat I think that works, *but* it still needs the QAST generated for the variable somehow 10:59
nine Have you looked at the variable_declarator action? 11:00
Maybe there's something else that does. Oh and I think your original patch didn't actually contain the attach call
lizmat it looks like it is missing a self.attach: $/, $decl; in the actions 11:17
so how would I add that?
11:18 sena_kun joined
lizmat m: use MONKEY; EVAL Q|our $x; say OUR::.keys|.AST 11:31
camelia ()
lizmat looks like "our $x" itself is still with problems
m: our $x; say OUR::.keys
camelia ($x)
11:38 epony left, epony joined
lizmat looks like the QAST differs 11:38
RakUAST: - QAST::WVal(GLOBALish) QAST::SVal($x) 11:39
base: - QAST::Var(lexical $?PACKAGE) - QAST::WVal(Str)
nine That doesn't necessarily indicate a problem. $?PACKAGE will contain GLOBALish and the new frontend just doesn't box the string but I don't think that will matter 11:49
12:00 reportable6 left
lizmat m: use MONKEY; EVAL Q|our $x; say $x; dd OUR::.keys|.AST # looks like it's going wrong if there's no initializer 12:00
camelia (Any)
lizmat m: use MONKEY; EVAL Q|our $x = 42; say $x; dd OUR::.keys|.AST
camelia 42
12:01 reportable6 joined
ab5tract lizmat: I hit a wall with that in one of my many diversionary approaches as well 12:02
nine I guess the old frontend always creates code to initialize our scoped variables? 12:06
lizmat m: use MONKEY; EVAL Q|our $x; say OUR::.keys; $x = 42; say OUR::.keys|.AST
camelia ()
nine Since our scoped variables are really just entries in the Stash, these entries must have some initial value after all 12:07
lizmat looks like it doesn't get vivified until assignment
I guess similar to: 12:09
m: my %h; my $x := %h<x>; say %h.keys; $x = 42; say %h.keys
camelia ()
nine I don't see any significant difference to the QAST of the old frontend though. Maybe the compiler does the vivification instead? 12:11
Yes, $*W.install_lexical_container will call install_package_symbol_unchecked which does an assignment 12:15
lizmat ok, will check an mimicry 12:16
*and 12:17
Geth rakudo/main: 1acb74d875 | (Elizabeth Mattijsen)++ | src/core.c/core_epilogue.pm6
Add :run named arg to .AST

Mostly to allow quicker testing, e.g. with camelia online
lizmat m: Q|our &foo; dd OUR::<&foo>|.AST(:run) 13:21
camelia Any element{'&foo'} = Any
lizmat m: our &foo; dd OUR::<&foo>
camelia Callable &foo = Callable
Nemokosch If there is a fresh state of test outputs, could you please make an "official" (valid) list of passing and failing test cases from it? 13:23
lizmat I guess we also need to fix that :-)
nine Nemo, what for? 13:24
Nemokosch To see the state of things. To be honest, I'm not at all confident when I look at a test output I produced; for example, I got like 21 "ok"s on a main branch checkout, after make && make install 13:42
nine should be a 100 more
Nemokosch you say fairly different numbers. And also, it would be good to know what's behind those numbers.
btw that "21" is 42 when I recompile with my change, so absolute chaos 13:43
nine what failures do you see?
ab5tract Nemokosch: you might want to re-run the Configure.pl script, maybe do a make realclean first 13:47
tellable6 ab5tract, I'll pass your message to Nemokosch
ab5tract nine: I'm totally lost with trying to tweak IMPL-CURRIES. Any problem I solve just creates another problem. For example, adding "'&&', 0" makes the an expression like 'suibset F where * && 5; my F $f = False' fail, it makes '(* && 5)(False)' die 13:59
The first example is wanted behavior, the second example is unexpected 14:00
Ah, maybe that's still related to the broken ApplyPostfix code 14:03
Still, I feel like my brain is melting -_- 14:04
also, yesterday we were discussing whether things curry or not. 14:09
m: (* == 5).^name.say 14:13
camelia ( no output )
ab5tract m: (* == 5).WHAT.^name.say 14:14
camelia WhateverCode
ab5tract but in the QAST generated by this expression, I don't see a WhateverCode
gar, should have double checked. I guess I'm getting a bit lost in comparing the outputs of * &&, * ==, and * ~~ 14:15
Nemokosch ab5tract back to that - yes, it would be good if I had a better understanding of what needs to be run to get a clean state installed 14:22
but I'd say regardless it would be good (and quite effortless, probably) to have an updated list - a table or something like that - of what "should work now", on main at least 14:23
nine m: (* && 5)(False) 14:24
camelia No such method 'CALL-ME' for invocant of type 'Int'
in block <unit> at <tmp> line 1
nine So dieing there is perfectly fine!
Nemokosch if I get confident in what I'm actually running, I might as well make such a table or something
to connect the two things
ab5tract nine!! 14:25
Nemokosch oh right, && doesn't Whatever-curry
nine You won't see a WhateverCode for the same reason you don't see a Method or Sub. Those are meta objects. They are part of the serialized _data_, not the code. What you will see is a QAST::Block that matches your expression 14:26
Nemokosch I wonder if Whatever-currying could be cleaned up on design level
once the new frontend works
ab5tract nine: Usually there is a little clone op that comes with a WVal of 'WhateverCode' 14:28
Nemokosch Anyway: current plan: I do a rakubrew triple, run make test and make spectest, with RAKUDO_RAKUAST=1, save the outputs... and then I do something with my local branch, rebase it, something for building, and then test again
nine Ah, yes, for dd (* == 5) I do get a QAST::WVal(WhateverCode) 14:30
Nemokosch, a find . -name .precomp | xargs rm -rf can help sometimes 14:31
Nemokosch sounds like a good idea 😅 👍 14:32
also, good to know what xargs is good for 14:33
nine Well the safer and more correct version of the command is: find . -name .precomp -print0 | xargs -0 -r rm -rf
ab5tract The only difference I can find between these two gists (other than us wrapping the ApplyInfix in ApplyPostfixes) is that in my branch, '$whatevercode_arg_1' is a 'contvar' instead of a 'var': gist.github.com/ab5tract/144c33cb3...638f66a6a5 14:38
I've said it before and been very wrong, but what I see is functionally equivalent :( 14:39
nine In what way does the code you gisted still fail? 15:12
ab5tract The assignment succeeds even when the constraint should make it fail 15:16
Nemokosch > grep '. ok' test_without | wc -l 15:18
> 129
looks better...
ab5tract Nemokosch: much!
tellable6 ab5tract, I'll pass your message to Nemokosch 15:19
Nemokosch 693 for "spectest_without"
nine ab5tract: the differences in generated QAST are not just cosmetic. Base just is (5 == 6) -> False. Your's is -> $_ { (5 == 6).ACCEPTS($_) }.Bool 15:30
Note that the pointy block never actually gets called!
ab5tract But why doesn't it get called? It gets called with similar branch QAST with '(* == 5)(6)' 15:33
damnit, no, in that case it is not wrapped... 15:34
QAST featured in my dreams last night 15:35
Nemokosch how should I run ./Configure.pl so that I get an actually working Makefile?
"Can't compiler [sic] CORE.c yet" doesn't sound healthy... 15:36
ab5tract Nemokosch: perl Configure.pl --gen-moar --gen-nqp --backends=moar
tellable6 ab5tract, I'll pass your message to Nemokosch
Nemokosch thankies
re tellable - the funny thing is that it does convert my name into Discord mentions
so I am "notified" in extra on the Discord side as well 15:37
I mean the bridge does that, not tellable itself
ab5tract ah, right
Nemokosch --backends=moar is probably a good idea indeed 😄 15:38
nine Do NOT run Configure.pl or make with RAKUDO_RAKUAST=1
only RAKUDO_RAKUAST=1 make test
Nemokosch all these crazy interactions... 15:39
ab5tract nine: so when you say that the block never gets called... how do I make sure it is called? 15:41
presumably I need to add an QAST op of 'call' somewhere 15:42
Nemokosch okay, now it's back to "vast majority of test cases fail" 15:49
ab5tract :(
Nemokosch it's annoying how tests are not really reproducible
ab5tract I think its because you are fiddling deep in the innards 15:50
any precomp files can subtly mess things up
Nemokosch when this run finishes, I will take a look at some individual tests 15:51
nine Why is there so much wrapping in the first place? Apparently there's no need to call ACCEPTS for example and indeed the old frontend doesn't.
Nemokosch the same thing happened last time, when I accepted everything broke, I suddenly had a clean run with 600 ok's
nine All you want is that block with cuid(2). That's your where condition. Everything else should go 15:52
Nemokosch, in my experience it's more productive to figure out why exactly things fail instead of trying random things 15:53
ab5tract nine: It's there because you told me not to special case ApplyInfix in the wrapping code :) 15:56
Nemokosch I won't be able to figure that out unless I try something in the first place
if something doesn't work at first, or second, or third, that's fine and to be expected 15:59
but that the whole thing just breaks down and I'm running circles around something that really should just work, that's brutally exausting...
nine ab5tract: that doesn't mean that the wrapping code is correct as it is. It just means that conditioning on ApplyInfix is the wrong thing. E.g. thunked expressions in general probably don't need any wrapping 16:00
Nemokosch, you are trying fixes, not investigating the problem. Unless I have misunderstood your message about going to take a look at individual tests. That would have been the first thing I'd advise. 16:02
16:05 sena_kun left 16:06 codesections left 16:07 codesections joined
ab5tract thunked expressions should all match a guard of 'nqp::istype($!expr, RakuAST::Code)', right? 16:11
nine no
Thunks are a property of expressions. They don't wrap them or change their nature.
And yes, the terms are a bit misleading, e.g. the wrap-with-thunk method. What gets wrapped is the generated code, not the expression node. 16:12
ab5tract hmm.. so along those lines I tried a guard of '(nqp::can($!expr, 'IMPL-CURRIED') && $!expr.IMPL-CURRIED)' but that didn't take either 16:13
nine I'd probably try $!expr.IMPL-CURRIED first as that's already there and if it works, investigate whether that should be extended to "any thunk" via a new method on Expression 16:14
$!expr is already a RakuAST::Expression, isn't it? So you can assume that it supports IMPL-CURRIED
ab5tract oh, fair 16:15
still, didn't trigger. maybe I need to run this begins after the children are visited?
nine Is the expression not IMPL-CURRIED or is it not IMPL-CURRIED _yet_ when you check?
Getting the timing right is arguably the hardest part in RakuAST 16:16
ab5tract make 16:17
I said, 'make', and I meant it! ^_^ 16:18
nine: Yeah, I'm starting to see what you mean by that
Nemokosch nine: how could I understand the problem without knowing the problem 16:22
TAP output is useless to an outstanding extent 16:23
ab5tract nine: no dice, still not hitting the guard :/ 16:24
nine ab5tract: I'd add debug output to IMPL-CURRY, probably including nqp::objectid(self) and then to the place that checks IMPL-CURRIED, also including nqp::objectid($!where) 16:26
That tells you if you're actually testing the object you're expecting and also the order of events
ab5tract nice!
nine It's amazing how the debug print is the simplest and also the most versatile debugging technique in existence. Even when debugging my C++ code it's sometimes easier to add a few std::cerr << ... to my code than to wade through it in gdb 16:29
tonyo nine++ been doing that since i was ten and still find it easier than anything else
nine Nemokosch, I meant, pick one of the failing tests and just run it individually with RAKUDO_RAKUAST=1 ./rakudo-m -Ilib t/foo/bar.t. That should give you a proper error message, i.e. a hint at what's wrong. 16:30
Nemokosch okay.... I ran a passing test on the "fixed version" - and guess what, it said 'ok' to everything 16:31
go figure, really...
nine What do you mean by "fixed version"? 16:32
Nemokosch the version built from my local branch 16:33
i.e the same version that only threw errors to spectest
nine Sorry, I don't undestand the situation. You ran a passing test and it said ok to everything. That's....good, isn't it?
Nemokosch it says ok if I run the tests individually 16:34
16:34 sena_kun joined
if I run RAKUDO_RAKUAST=1 make spectest, it's all "dubious, test returned 1" 16:35
the exact same tests
nine When you run it individually, what's the exit code?
echo $?
Nemokosch 0
RAKUDO_RAKUAST=1 raku t/spec/APPENDICES/A02-some-day-maybe/concreteness.t && echo "hooray!" # will hooray 🙂 16:36
my only idea is that something broke around the test harness itself 16:37
nine Does the test output contain anything besides the ok lines? 16:46
Nemokosch gist.github.com/2colours/bd4936ad9...30e2aa790c 16:47
nine That doesn't look too bad. What about RAKUDO_RAKUAST=1 make t/spec/APPENDICES/A02-some-day-maybe/concreteness.t 16:50
Nemokosch are you sure you meant make? 16:51
good old "no such target available" 16:52
16:53 donaldh joined
nine nine@sunshine:~/rakudo (main *>)> make t/spec/S02-lists/indexing.t 16:54
'/usr/bin/perl' -I'/home/nine/rakudo/tools/lib' -I'/home/nine/rakudo/3rdparty/nqp-configure/lib' t/harness5 --moar --fudge --keep-exit-code --verbosity=1 t/spec/S02-lists/indexing.t
Like this ^^^
Ah, that file is too deep in the directory hierarchy. The makefile only does t/*/*.t t/*.t t/*/*/*.t not t/*/*/*/*.t 16:56
Nemokosch I copied the line and running it, that was a successful test 16:59
> Files=1, Tests=4, 5 wallclock secs ( 0.02 usr 0.00 sys + 8.16 cusr 0.45 csys = 8.63 CPU) 17:00
Result: PASS and all that jazz
could be, then, that the Makefile is misgenerated?
nine I did have the same issue with the 2 cpp nativecall tests which the harness reported as not ok, despite them passing just fine when running individually. Eventually I concluded it must be a bug in the harness, misattributing failures to these files, as they only were listed as failed in runs where other files were failing. 17:03
Those 2 failures have gone away since though but I can't for the life of mine remember if it was due to a specific fix or just because the files they inherited those failures from were fixed 17:04
Nemokosch the strange thing is, "make test" doesn't fail it all
"make spectest", however, fails from the very start
nine Do all files in spectest fail? 17:05
Nemokosch now go figure... I just started another run and NOW there are passing spectests, and yes, I set RAKUDO_RAKUAST=1 17:06
actually, all of a sudden, there is a good amount of 'ok's
is the harness known to act differently when the output is piped? 17:07
that's one thing I could think of
nine I don't know. My standard command is: make && TEST_JOBS=20 RAKUDO_RAKUAST=1 make spectest | grep '\. ok' | sort | tee $(git describe).pure.tests | wc -l 17:09
Nemokosch Whatever changed... this output seems testable, at least 17:14
actually comparable to the stable version
17:22 donaldh left
ab5tract ok, it's progress, I guess... So now unmet constraint values fail to assign. But so do valid, met constraint values ... 17:30
17:30 NemokoschKiwi joined
ab5tract could it be due to binding a decont'd parameter to a 'contvar' ? 17:32
at the QAST level
18:00 reportable6 left 18:01 reportable6 joined 18:15 ab5tract left 18:16 NemokoschKiwi left
nine I don't know. Could be 18:19
lizmat nine: I just found a difference in the QAST for "our $foo" 18:22
in base, the Op(bind) is *after* the QAST::Var(GLOBALish)
in RakuAST, it is before
also, the RakuAST version is missing a QAST::Var(lexical $a :decl(contvar)) :our_decl<?> 18:24
am I missing something if I say that "use fatai" is basically the same as adding a: POST 18:51
POST $_ ~~ Failure ?? .throw !! True 18:52
phaser to each block in which "use fatal" is active ?
m: sub a { use fatal; fail }; my $a = a 18:53
camelia Died
in sub a at <tmp> line 1
in block <unit> at <tmp> line 1
lizmat m: sub a { POST $_ ~~ Failure ?? .throw !! True }; my $a = a
camelia ( no output )
lizmat m: sub a { POST $_ ~~ Failure ?? .throw !! True; fail }; my $a = a
camelia Failed
in sub a at <tmp> line 1
in block <unit> at <tmp> line 1
lizmat m: sub a { POST $_ ~~ Failure ?? .Exception.throw !! True; fail }; my $a = a 18:54
camelia Failed
in sub a at <tmp> line 1
in block <unit> at <tmp> line 1
lizmat and also: wouldn't such a POST phaser be potentially generic, as in the same for each block that would need it?
nine doesn't understand fatal enough to comment 19:09
I also don't understand why our scoped things still get lexicals declared for them (in the old compiler) 19:10
lizmat because they are lexically scoped 19:13
m: { our $a = 42 }; say $a
camelia ===SORRY!=== Error while compiling <tmp>
Variable '$a' is not declared. Perhaps you forgot a 'sub' if this was
intended to be part of a signature?
at <tmp>:1
------> { our $a = 42 }; say ⏏$a
lizmat m: { our $a = 42 }; say OUR::<$a>
camelia 42
nine Btw. the design and our docs contradict each other there. S04 says "our $foo" introduces a lexically scoped alias for a variable in the current package. 20:21
docs say: our variables work just like my variables, except that they also introduce an alias into the symbol table. 20:22
I think the S04 version makes sense. The lexical variable is an alias for the package variable, not the other way round. Otherwise why would the package variable still be available, when the variable it's an alias for goes out of scope? 20:23
Nemokosch so you mean: which one is the alias and which is the real thing? 20:24
nevermind, the other message pretty much clarified
fair point... 20:25
does "symbol table" only refer to package-scoped things? 20:26
21:00 NemokoschKiwi joined 21:01 NemokoschKiwi left
nine In that sentence at least. But yeah, that's another ambiguity in the docs. The design docs are more clear 21:11
Nemokosch yeah I was thinking how to rephrase it 21:22
nine I think S04 already spells it quite nicely :) 22:00
22:49 sena_kun left
Nemokosch okay cool, my fix lowered the number of passing spectests by around 85 xD 23:16
next step: figure out which ones. Tbh I doubt I will start with it "today" 23:17
nine: > As in Perl 5, "C<our $foo>" introduces a lexically scoped alias for a variable in the current package 23:18
is this what you meant?
(I guess "as in Perl 5" can go)
Geth rakudo/main: fff197957a | (Elizabeth Mattijsen)++ | 3 files
Make "use fatal" operational

Instead of wrapping each block in a check, use the "POST" phaser mechanism to insert a special POST phaser into a block when
  "use fatal" is active.
Adds a ".fatalize" implementation-detail method to Block for convenience.
lizmat sadly, this does not bring us more passing test :-(
23:39 epony left