🦋 Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). Log available at irclogs.raku.org/raku/live.html . If you're a beginner, you can also check out the #raku-beginner channel! Set by lizmat on 6 September 2022. |
|||
00:04
lichtkind left
00:11
simcop2387 joined
00:12
jdv joined
|
|||
SmokeMachine | Does that make sense? | 00:22 | |
00:22
Sgeo joined
|
|||
SmokeMachine | lizmat: about the wrap/assuming issue, assuming does not solve the problem… I need that for a trait_mod to modify a sub… the code I was writing when I needed that is this one: github.com/FCO/Deps/blob/baf1d7e24...akumod#L74 | 00:50 | |
01:25
Sgeo left
01:31
Sgeo joined
01:46
arkiuat_ joined
01:49
arkiuat left
01:53
hulk joined,
kylese left
02:15
hulk left
02:16
kylese joined
03:27
vasko left
03:31
vasko joined
03:45
kylese left
03:47
kylese joined
04:10
Aedil left
04:11
melezhik joined
04:16
Aedil joined
05:05
arkiuat_ left
05:18
arkiuat joined
06:22
arkiuat left
06:46
arkiuat joined
06:51
arkiuat left
07:19
arkiuat joined
07:24
arkiuat left
07:47
arkiuat joined
07:52
arkiuat left
07:53
Sgeo left
08:10
apac joined
08:13
dakkar joined
08:21
arkiuat joined
08:22
lichtkind joined
|
|||
Voldenet | SmokeMachine: that approach with named dependencies seems ok, but if it was a variable, then it would be more resistant to typos and in the best case wouldn't even require string-hash lookup | 08:31 | |
also, there's that case `deps-root { start { … use deps-root } }` deps-root would end before the "start" ends - for only this case some lower level api would be needed probably | 08:33 | ||
SmokeMachine | When passing the deps (I mean on injectable and injected) it also accepts a Deps object instead of a Str… but now you mentioned, I’ll make it (deps, deps-root and deps-scope) to, if :$deps is rw, to store the obj into that variable instead of using that as a name… | 08:35 | |
Voldenet | the latter problem would probably need some trait like `:dangling` implying that it would be menually cleaned up | 08:37 | |
SmokeMachine | Yes… the start would be a problem… I was wondering if wrapping start to get the dyn var, put it into a local var, call the original start, create a new dyn var with the content of the local var and call the original block would make sense… but I’m not sure about that… | 08:38 | |
Voldenet | dyn vars and threading are causing problems sometimes | 08:39 | |
it works, but if it doesn't then it's pain to debug | |||
SmokeMachine | Yes… | ||
Voldenet | Oh, in some cases it's necessary to keep all the scopes around (like when you start websocket connection, store in the CurrentWebsocket and keep all the scopes in one big array) | ||
so that the scopes would be per websocket connection session | 08:40 | ||
and closing one websocket would send "websocket has disconnected" notification to all others | |||
SmokeMachine | Maybe deps should accept a :$use optional arguments that would make use that internally… that way we could: deps-root :deps($root), { start { deps :use($root), { … } } } | 08:41 | |
Voldenet | you could discard one {} probably | 08:42 | |
SmokeMachine | Yes… | 08:43 | |
Voldenet | `deps-root :deps($root), { start deps :use($root), { … } }` | ||
but | |||
SmokeMachine | Would that make sense? | ||
Voldenet | `deps-root :deps($root), :dangling { start deps :use($root), { … } }` | ||
since otherwise root would cleanup before start used the root | 08:44 | ||
08:44
arkiuat left
|
|||
SmokeMachine | Sorry, what the word dangling means? | 08:44 | |
Voldenet | it's from `dangling pointer`, but probably not the best word here | 08:45 | |
:no-cleanup | 08:46 | ||
maybe | |||
SmokeMachine | Ok, now I got it! :) | ||
Voldenet | deps method would basically invoke all the cleanups on the end | ||
unless it was told not to | 08:47 | ||
SmokeMachine | Other thing it could do is that if it returns a Promise, add a then on that to cleanup only when the promise is finished… | ||
(By it I mean the block) | |||
Voldenet | ah, that would prevent multiple cleanups | 08:48 | |
SmokeMachine | (We do something similar with Red on red-do :transaction, { start … } | 08:50 | |
(If I still remember it correctly) | 08:51 | ||
09:01
librasteve_ joined
|
|||
Voldenet | I'm unsure whether multiple cleanups should fail or if child scopes should cleanup when parent is cleaned up | 09:03 | |
09:04
arkiuat joined
|
|||
Voldenet | maybe `try-cleanup` should not fail, `cleanup` should, parent should have children's try-cleanup registered | 09:06 | |
or parent could just show warning when any child is not cleaned up, but not clean it up | 09:07 | ||
09:09
arkiuat left
|
|||
librasteve | Hi everyone o/ - I have volunteered to make a prototype new version of the raku.org website - following on from [Coke]'s request for input and feedback, please can you visit github.com/librasteve/raku-org-25-proto and provide your inputs and comments - either raise an issue for discussion, or via a PR if it is more concrete. [You will see that I have tried to get the ball rolling with a strawman ... but happy to adapt | 09:11 | |
and work with everyone to get to a concensus on what is needed...] I have set a completely arbitrary deadline of 5 days to complete the (non technical) requirements so that we can keep some momentum. | |||
SmokeMachine | librasteve_: sorry, I forgot the release… I just did it now. | 09:13 | |
Voldenet: I think I’ll leave the cleanup implementation for a future step… after having a few examples where that’s needed… what do you think? | 09:16 | ||
Voldenet | SmokeMachine: makes sense, in a few days I'll probably extend my examples to incorporate full lifetime for things | 09:18 | |
I'll add object pool and some other basics so the "why need cleanup" is more obvious | 09:20 | ||
and hopefully also test it on the way | |||
SmokeMachine | Voldenet: when you do that, please let me know that I’ll convert it to Deps… | 09:22 | |
melezhik | librasteve_: I skimmed very the requirements.md looks good. Maybe in plus with to mentioned all battery included ecosystem - cro, HARC for web development, Red - database ORM, Sparrow - automation framework - those are just examples, not a pitch ))) | ||
So the focus on solutions and ready tools not just language | 09:23 | ||
SmokeMachine | Voldenet: it may be just a toy project… but I’m liking what it’s becoming… | ||
melezhik | Quite important from people without huge programming background and CS | ||
Voldenet | librasteve: I feel that raku can be written a lot like java, because it has interfaces, inheritance, exceptions - maybe it'd be nice to actually write out an example of various languages and raku side-by-side | 09:26 | |
to express how powerful the "multiparadigm" is | 09:27 | ||
However, imo raku is not very much like javascript | 09:29 | ||
inheritance and js is completely different, operators also try very hard not to throw exceptions | |||
m: "a" - 1 | 09:31 | ||
camelia | WARNINGS for <tmp>: Useless use of "-" in expression "\"a\" - 1" in sink context (line 1) Cannot convert string to number: base-10 number must begin with valid digits or '.' in '<HERE>a' (indicated by <HERE>) in block <unit> at <tmp> line 1 |
||
Voldenet | this is valid code in js and gives proper result - not a number :> | ||
Promises are js-like, but whole async is also entirely different | 09:32 | ||
SmokeMachine | I really think Promises could be MORE js-like… | 09:34 | |
Voldenet | they actually could | 09:37 | |
09:38
arkiuat joined
|
|||
Voldenet | the biggest difference is that .then will execute the code regardless of Promise state | 09:38 | |
m: my $p = Promise.new; $p.then({ say "uh oh" }); $p.vow.break("nope"); await $p | 09:39 | ||
camelia | uh oh An operation first awaited: in block <unit> at <tmp> line 1 Died with the exception: nope in block <unit> at <tmp> line 1 |
||
Voldenet | while in javascript there's `.then` (which comes from jquery's Deferred, so it) and it has two arguments | 09:41 | |
s/so it/ | |||
because of that, then in java's reactor, ContinueWith in C# and then in raku are actually a mess to deal with | 09:42 | ||
09:43
arkiuat left
|
|||
Voldenet | the simple js code `fetch("thing").then(t => t.json()).then(j => fetch(j.otherThing)).then(x => Math.pow(x, 2)).catch(x => console.error(x));` is an absolute madness to write anywhere else | 09:44 | |
if anything, it shows how much closer raku is to java, probably | 09:49 | ||
SmokeMachine | Not only that, but also what then receives, and what it does when the block returns another promise | 09:51 | |
But I don’t think Raku is close to Java… but you can write code as if it was… | 09:52 | ||
librasteve | SmokeMachine: thanks! | 09:56 | |
all - great to see some constructive ideas - and its always nice to chat - but don't forget to create an issue over on the GH repo so that they can get folded into the prototyping | 09:58 | ||
(yes I COULD copypasta over there - but then I want the contribution to be clear - and I want to be able to try and consolidate common threads - thus the GH repo ;-) ) | 09:59 | ||
10:01
abraxxa-home joined
|
|||
Voldenet | Huh | 10:01 | |
m: my $p = Promise.new; $p.andthen({ say "uh oh" }); $p.vow.break("nope"); await $p | |||
camelia | An operation first awaited: in block <unit> at <tmp> line 1 Died with the exception: nope in block <unit> at <tmp> line 1 |
||
Voldenet | So apparently it is possible to write that, just it is not documented | ||
I'm standing corrected - `andthen` and `orelse` methods change my views on the usefulness of Promise entirely | 10:04 | ||
10:04
abraxxa-home left
10:05
abraxxa-home joined
|
|||
SmokeMachine | m: start({ 42 }).andthen: *.say | 10:06 | |
camelia | ===SORRY!=== Error while compiling <tmp> Undeclared routine: start used at line 1. Did you mean 'sort', 'spurt', 'sqrt'? |
||
10:06
arkiuat joined
|
|||
SmokeMachine | m: start({ 42 }).andthen: &say | 10:06 | |
camelia | ===SORRY!=== Error while compiling <tmp> Undeclared routine: start used at line 1. Did you mean 'sqrt', 'spurt', 'sort'? |
||
SmokeMachine | m: (start { 42 }).andthen: *.say | 10:07 | |
camelia | ( no output ) | ||
SmokeMachine | m: (start { 42 }).andthen: &say | 10:08 | |
camelia | ( no output ) | ||
SmokeMachine | It does not receive anything??? | ||
Voldenet | but it does, however promises are always running asynchronously | 10:11 | |
librasteve | Ok seems like I have caused some confusion - sorry. So I have started a couple of Discussion Issues over at the GH repo to try and help ... | ||
github.com/librasteve/raku-org-25-...o/issues/1 ... Discussion: Mention High Value Modules this has melezhik's comments ... pretty straightforward idea imo... | 10:12 | ||
SmokeMachine | m: await (start { 42 }).andthen: &say | ||
camelia | Promise.new(scheduler => ThreadPoolScheduler.new(uncaught_handler => Callable), status => PromiseStatus::Kept) | ||
Voldenet | m: await (start { 42 }).andthen: *.result.say # but of course | ||
camelia | 42 | ||
SmokeMachine | Different from js that receives what the previous step returned, it receives the promise itself… | 10:14 | |
librasteve | github.com/librasteve/raku-org-25-...o/issues/2 Discussion: Comparison Languages to Illustrate Multiparadigm ... this is an empty discussion intended to capture Voldenet remarks - I thought about copying comments over from here, but tbh I am confused about all the concurrency examples ... | ||
10:14
abraxxa-home left
|
|||
SmokeMachine | That may make sense… but I’m just pointing a difference… | 10:15 | |
librasteve | so dear Voldenet, please can you head over to that Issue and explain your idea briefly there (typically you need ot explain to me like you would a dog or a small child) | ||
10:15
abraxxa-home joined
|
|||
SmokeMachine | m: say await (start { 1 }).andthen({ 2 }) | 10:16 | |
camelia | 2 | ||
Voldenet | librasteve: the concurrency examples are actually separate hole I accidentally dropped into, sorry | ||
SmokeMachine | m: say await (start { 1 }).andthen({ start { 2 } }) | 10:17 | |
camelia | Promise.new(scheduler => ThreadPoolScheduler.new(uncaught_handler => Callable), status => PromiseStatus::Kept) | ||
SmokeMachine | In js it would print 2… | ||
Voldenet | in js promises automatically get unwrapped before entering .then | ||
so… | |||
m: say await (start { 1 }).andthen({ start { 2 } }).result.result | 10:18 | ||
camelia | An operation first awaited: in block <unit> at <tmp> line 1 Died with the exception: Can only specify Awaitable objects to await (got a Int) in block <unit> at <tmp> line 1 |
||
Voldenet | m: say await (start { 1 }).andthen({ start { 2 } }).result | ||
camelia | 2 | ||
Voldenet | right, there's an await | ||
SmokeMachine | m: multi aawait(Awaitable $a) { aawait await $a }; multi aawait($a) { $a }; say aawait (start { 1 }).andthen({ start { 2 } }) | 10:23 | |
camelia | 2 | ||
Voldenet | librasteve: I've added some example that you might be familiar with :) | 10:33 | |
m: multi aawait(Awaitable $a) { aawait await $a }; multi aawait($a) { $a }; say aawait start start start start { 42 } | 10:35 | ||
camelia | 42 | ||
Voldenet | that's nice | ||
m: await Promise.broken("boo").orelse({ 42 }).then( -> $r { say $r.result }) | 10:40 | ||
camelia | 42 | ||
Voldenet | Docs attempt for those methods has been made, because I'll forget it if I don't do that asap: github.com/Raku/doc/pull/4584 | 10:55 | |
SmokeMachine | glot.io/snippets/h7sotvz66u | 11:04 | |
Voldenet | SmokeMachine: it'd be enormously nice if the default implementation did that, in fact andthen and orelse were not documented, so maybe it's possible to sneak these changes | 11:06 | |
SmokeMachine | Voldenet: I think that would be great! | 11:07 | |
Voldenet | in fact, in case of `then` it's needed to have the promise to get its state | 11:08 | |
SmokeMachine | But for andthen, that’s not needed… | ||
11:10
arkiuat left
|
|||
Voldenet | I've added that as a comment to `github.com/Raku/doc/pull/4584`, I'll add an issue with this | 11:14 | |
11:29
arkiuat joined
|
|||
Voldenet | SmokeMachine: I've added issue with these two methods github.com/rakudo/rakudo/issues/5892 - feel free to suggest the change about unwrapping the promises recursively - I only propose to do one-level unwrap | 11:39 | |
it's possible to maybe add some sort of method like `.unwrap` (are we Rust yet ;>) | |||
SmokeMachine | Comment added… what does .unwrap do? | 11:44 | |
11:49
apac left
|
|||
Voldenet | SmokeMachine: convert Promise<Promise<T>> to Promise<T> | 12:25 | |
(though rust unwrap is notoriously used to extract T from `Result<T, E>` or `Option<T>` or panic if it's not possible | 12:28 | ||
…so if you are sure that the value is there in the context and execution doesn't make sense otherwise, .unwrap() gets used) | 12:30 | ||
I'm not a big fan of unwrap, but having promise being a result of andthen is rare | 12:39 | ||
12:42
euandreh joined
|
|||
SmokeMachine | I don’t think that’s rare… I would say I do that in most of my já code… | 12:55 | |
s/já/js/ | |||
13:19
Sgeo joined
13:26
abraxxa-home left
13:34
yewscion joined
|
|||
Voldenet | eh | 13:40 | |
it's not that rare in js, but I wonder how necessary is that in raku | 13:47 | ||
13:48
arkiuat left
|
|||
Voldenet | m: sub foo { await Promise.in(1); $^n + 1 }; say await gather for ^20 { take Promise.kept($_).then({ my $f = foo(.result); say .result; $f }) } | 13:51 | |
camelia | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20) |
||
Voldenet | this is async yet not | ||
it's weird because you can have code that's not inside a promise yet it is async | 13:52 | ||
and it's normal, full async | |||
the continuation in js is run synchronously and the piece of code can't suspend in the middle | 13:55 | ||
14:01
arkiuat joined
14:06
arkiuat left
14:08
Guest19 joined
14:14
arkiuat joined
14:20
arkiuat left
14:35
arkiuat joined
15:56
yewscion left
15:58
abraxxa-home joined
16:18
arkiuat left
16:25
yewscion joined
16:29
yewscion left
16:30
arkiuat joined
16:31
dakkar left
16:34
yewscion joined
16:37
arkiuat left
16:45
Guest19 left
16:52
apac joined
17:07
arkiuat joined
17:12
arkiuat left
17:32
arkiuat joined
17:37
arkiuat left
17:44
yewscion left
17:52
arkiuat joined
18:08
Aedil left
18:28
yewscion joined
18:30
melezhik left
18:31
Aedil joined
18:48
yewscion left
19:01
yewscion joined
19:09
melezhik joined
19:23
euandreh left
|
|||
[Coke] | www.reddit.com/r/rakulang/comments...requested/ | 19:29 | |
19:34
euandreh joined
19:35
maylay left
19:36
maylay joined
19:38
maylay is now known as theif
|
|||
librasteve | [Coke]: thanks for the cross post! | 19:40 | |
20:07
lucasb joined
20:17
euandreh left
20:23
apac left
20:35
Aedil left
20:41
theif left,
maylay joined
21:09
yewscion left
21:21
arkiuat left
21:28
lichtkind left
21:31
abraxxa-home left
21:50
arkiuat joined
|
|||
Voldenet | btw, I thought about promises a bit and I think .await callable on promise could be useful | 21:53 | |
21:55
arkiuat left
|
|||
Voldenet | m: Promise.kept("3").&await.say | 21:56 | |
camelia | 3 | ||
Voldenet | this is already doable, but plain await would've been less magical | 21:57 | |
21:59
lichtkind joined
22:05
arkiuat joined
|
|||
Voldenet | m: await(Promise.kept("3")).say # the same method with plain await sub | 22:07 | |
camelia | 3 | ||
22:09
arkiuat left
22:13
lichtkind left
22:35
arkiuat joined
22:40
arkiuat left,
melezhik left
22:47
arkiuat joined
23:42
yewscion joined
23:45
yewscion left
23:53
lucasb left
|