🦋 Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). This channel is logged for the purpose of keeping a history about its development | evalbot usage: 'm: say 3;' or /msg camelia m: ... | Log inspection is getting closer to beta. If you're a beginner, you can also check out the #raku-beginner channel! Set by lizmat on 25 August 2021. |
|||
00:13
lichtkind left,
MasterDuke91 joined
00:15
monkey_ joined
00:24
monkey_ left
01:24
evalable6 left,
linkable6 left
01:27
linkable6 joined
01:42
monkey_ joined
01:55
kjp left
01:56
kjp joined
02:27
monkey_ left
02:57
sftp left,
sftp_ joined
02:58
sftp_ is now known as sftp
03:25
evalable6 joined
|
|||
Geth | doc: codesections++ created pull request #3962: Explain "list" vs "destructuring" assignment |
03:53 | |
04:00
MasterDuke91 left
04:05
reportable6 joined
04:25
Xliff left
04:33
keutoi joined
05:33
committable6 left,
statisfiable6 left,
greppable6 left,
sourceable6 left,
releasable6 left,
linkable6 left,
evalable6 left,
squashable6 left,
bisectable6 left,
shareable6 left,
bloatable6 left,
nativecallable6 left,
unicodable6 left,
benchable6 left,
notable6 left,
coverable6 left,
quotable6 left,
tellable6 left,
reportable6 left,
unicodable6 joined
05:34
evalable6 joined,
nativecallable6 joined,
coverable6 joined,
tellable6 joined
05:35
greppable6 joined
05:36
committable6 joined,
shareable6 joined
05:39
Altai-man left
06:03
reportable6 joined
06:34
sourceable6 joined,
linkable6 joined
06:35
quotable6 joined
06:36
benchable6 joined,
notable6 joined,
bloatable6 joined,
squashable6 joined
06:56
frost joined
06:57
codesections left
07:36
bisectable6 joined,
statisfiable6 joined
07:42
Sgeo left
08:10
dakkar joined
08:36
releasable6 joined
09:10
clarkema joined
09:23
lichtkind joined
09:33
lizmat_ joined
09:37
lizmat left,
lizmat_ is now known as lizmat,
lizmat left,
lizmat joined
10:35
xinming left
10:59
squashable6 left
11:05
lizmat left
11:08
TempIRCLogger left
11:09
lizmat joined
11:10
TempIRCLogger joined
12:00
squashable6 joined
12:03
reportable6 left
12:15
C0l0mb0 joined
|
|||
C0l0mb0 | newb question from long-time Perl programmer. I want to convert a Perl5 script into raku to learn raku. So my first issue is the perl code "while (<>) { etc }". what are the best resources to learn what the raku equivalent of <> is? | 12:18 | |
I have looked at docs.raku.org/language/5to6-nutshell but its not that detailed | 12:20 | ||
sjn | C0l0mb0: ok? would you mind sharing with us what you feel is missing from the 5to6-nutshell page? | 12:26 | |
it covers quite a bit, but if something important is missing, that's worth fixing :-) | 12:27 | ||
C0l0mb0 | I'm trying to find how to write a cli that can take in piped lines or use the first parameter as a filename to read in and execute line by line | 12:28 | |
CIAvash | C0l0mb0: it's `lines()` | 12:30 | |
C0l0mb0 | it would be handy if 5to6 showed some example programs like that to use as a skeleton | ||
sjn | Ok, you may want to also look at the MAIN method, for command line flags... | ||
s/flags/parameters/ | 12:31 | ||
C0l0mb0 | CIAvash: yes - I found "lines()" from the raku error message when I tried just running the old Perl 5 code, I'm impressed with the error messages in raku | ||
sjn | The section named "Getopt::Long" shows a short example | ||
C0l0mb0 | sjn: ah yes, that is useful, didnt see that earlier | 12:32 | |
sjn | (Yeah, some of these topics could probably be improved with some better keywords and descriptions) | ||
C0l0mb0 | I'm keen to convert some of my scripts to Raku and learn that way. It does seem like an awesome language | 12:34 | |
sjn | converting scripts is a good way of exploring the language :) | ||
C0l0mb0 | yeah, I've been doing the REPL examples but I really want to make my first proper .raku script and start using it for real work | 12:35 | |
13:05
reportable6 joined
13:24
frost left,
C0l0mb0 left
|
|||
Altreus | does Red provide something like a to-hash on its models? | 13:27 | |
SmokeMachine__ | Altreus: do you mean to get a row (an object) as a hash? | 13:32 | |
kawaii_ | SmokeMachine__: we do, I have an object ^load has given me like this; `Character.new(id => 35383842, tier => 1, comment => "test", date-added => DateTime.new(2016,5,10,17,20,18.674), author => 496805464491687949)` and apparently to-json doesn't like it. :( | 13:33 | |
Altreus | aye, just a naive conversion to a column => value hash | 13:39 | |
SmokeMachine__ | if you want json, you can just do something like: usercontent.irccloud-cdn.com/file/.../image.png | 13:40 | |
Altreus | JSON::Class! | 13:41 | |
I still think to-json is an antipattern and I'm waiting for history to agree with me, but at least it makes a prototype quick | |||
SmokeMachine__ | But if you want this to make Red objects accessible throw JSON:API interface... I've been playing with this that could be useful (but still far from completed and help needed): github.com/FCO/CroX-Red-JsonAPI | 13:44 | |
but if you don't want JSON:API but just want to jsonify a ResultSeq,Jonathan Stowe has done this: twitter.com/gellyfish/status/14178...7882563590 | 13:47 | ||
gist.github.com/jonathanstowe/7d2e...cac0792cbb | 13:48 | ||
14:24
xinming joined
14:39
xinming left
14:40
xinming joined
|
|||
vrurg | That's interesting how things pop up close to what I was doing recently... I have a good experience JSONifying Red models with JSON::Marshall. | 14:48 | |
Altreus | I don't like the implication that every object only has one possible representation in JSON | 14:51 | |
nor do I like the danger of accidentally outputting a password column in JSON because the computer is doing as it was told! | |||
to-json is a procedure that should be owned by the view class: the controller, or an adapter, or something | 14:52 | ||
14:52
lichtkind left
|
|||
vrurg | Altreus: has Str $.password is password handles <check-password> is json-skip; | 14:52 | |
Altreus | There's no reason a Red class should know how a Cro webapp wants to represent it | ||
You don't put to-html on it | |||
I don't know why JSON is so special that rendering things as JSON goes on the things and not the renderer | |||
It's very bad! | 14:53 | ||
It couples your JSON API to your database schema, which is already naughty | |||
cos it means you can't change the schema without changing the API | |||
and you can't change an API | |||
vrurg | In my use JSON goes almost nowhere close to rendering. The only thing I need it for is to simplify JSON-RPC communication with the frontend. | ||
Altreus | outputting JSON /is/ rendering | 14:54 | |
Database models should not be directly connected to an API | |||
that's why MVC was so popular | 14:55 | ||
where did it go :( | |||
vrurg | Things like user account entries are hardly something to be changed. | ||
Altreus | How long does software engineering have to be a discipline before people realise that what they think the future holds is rarely what the future holds? | ||
I've been at this company for 2 years now and most of that time has been removing assumptions like that from the code | |||
All for the sake of putting to-json(User) in the right place | 14:56 | ||
vrurg | There are exceptions. What if your frontend is actually managing the database? Then your API is bound to it anyway. | 14:57 | |
Altreus | the problem is, of course, not that you call $user.to-json in the controller: rather, it's the fact that if to-json changes, you break your API by accident | ||
Telling me there are exceptions implies you agree with the rule in general, so that's enough for me | |||
vrurg | It's hard to argue, I'd say. :) | 14:59 | |
Altreus | good cos I have citations to back me up :D | 15:00 | |
specifically in the "Don't couple your API to your database" regard | |||
if only I could find the book... | |||
SmokeMachine__ | Altreus: you could `($model but JSON::Class).to-json` on your view, no? | ||
Altreus | SmokeMachine__: that's correct, and that is where you would do that | 15:01 | |
But then the point is you have the opportunity to amend that line without breaking the controller | |||
vrurg | The case of user account is the kind where direct mapping of a user record to API is acceptable if you want to provide basic user info to the frontend. The other thing is when you want to provide more extended account info like personal information (kind of meta-info) as this is something more mutable and should even be kept in a separate DB table. Just as an example. | ||
Altreus | because now if you put a password on that model, how could you possibly put json-skip on it? | ||
direct mapping is never appropriate because it means you can't change your mind about *anything* in the future | 15:02 | ||
What if you got the memo that "first_name" and "last_name" shouldn't be separate fields? | |||
now you want to update your model to live in the future by dropping those columns and just using a name field | |||
But you can't because that's a breaking change to the API | 15:03 | ||
If you'd just implemented a view at the start you could do a "best guess" for the old API and implement a new API with just name | |||
Nothing is immune to the "I did it wrong" bug | |||
Assuming it was written right is probably the main problem with software in the first place :P | 15:04 | ||
I recognise this applies to the very argument I'm making | |||
vrurg | Altreus: Full name is meta. My example is about a user record which consists of: id, username, group flag (account is a goup), and password. The rest is locate somewhere else. Now, what would you change in this table? ;) | ||
Altreus | I don't know. What changes in the future? | ||
I've not been there so I can't tell you | |||
Maybe you add a 2fa secret | 15:05 | ||
forget to put json-skip on it | |||
vrurg | Altreus: 2fa goes as a separate service with it's own data. Miss. | ||
Altreus | JSON::Class uses a blacklist for sensitive data, which is a bug waiting to happen | ||
vrurg | I mean, that table is the core. It is proclaimed immutable. Period. There're things not changing ever. Ask Microsoft, they know alot about these. :D | 15:06 | |
Altreus | You're asking me to invent a future reason why your arbitrary specific instance might be bad in the future | ||
15:06
lichtkind joined
|
|||
Altreus | Why? | 15:06 | |
Assume it will go wrong, and protect against it | |||
This discussion is already pages and pages longer than the code required to protect yourself against data leaks in future | |||
You're arguing against defensive coding | 15:07 | ||
Don't :P | |||
vrurg | You fall into another trap. It's too hard to hold swampy ground. You need axioms to build theorems. | ||
Altreus | Saying something isn't going to happen just because you don't have enough imagination to see why it might happen is not sustainable | 15:08 | |
If there's one thing software is great at it's undermining those assumptions | |||
vrurg | What I'm arguing against is that I'm often loose too much time considering making code less vulnerable to future changes. Sometimes it doesn't worth time spent. | ||
Altreus | well sure, we all come up against time constraints | 15:09 | |
That's why it's helpful to have design patterns | |||
vrurg | And you're discussing this with someone who is too often blamed for saying "what if this goes wrong?" :D | ||
Altreus | So you can pre-solve this issue by always passing your models through a view adapter, even if it's thin | ||
SmokeMachine__ | on that case you should do something like`to-json %( name => "{ .first-name } { .last-name }", password => "***" ) given $model` or something like that | 15:10 | |
vrurg will be away for a while | |||
Altreus | and then to-json might as well be to-hash | ||
Which is another thing!!!! | |||
It doesn't return JSON! | |||
Why is it called to-json when it doesn't return JSON? | |||
SmokeMachine__: right, but then someone adds more sensitive data and suddenly it's popping out on the API, even though nobody updated the API spec to include it | |||
no, you should ALWAYS get data via whitelist | 15:11 | ||
cos you never know what is going to show up! | |||
SmokeMachine__ | that IS a white list, isn't it? if someone change the model, it won't change anything on the generated answer... | 15:12 | |
15:12
Sgeo joined
|
|||
Altreus | sub for-json(MyModel:D $model) { $model.to-hash<key1 key2 key3>:kv } | 15:12 | |
oh ... I totally misread your use of to-json, sorry | |||
yes, like that | |||
got a bit carried away ^^; | |||
vrurg | BTW, I the white list is a good thing. Wish it be how JSON::Marshall do things, use `is json-use` instead of `is json-skip`. | 15:14 | |
s/I// | 15:15 | ||
Altreus | maybe fork it and do that :) | ||
I think a combination is perfectly reasonable | |||
(except don't call it JSON because it's not JSON) | |||
ToHash::Simple, which provides to-hash and is hash-use | 15:16 | ||
or something | |||
now you can add the role to literally any class and make selected properties come out in to-hash | 15:17 | ||
I bet you can even do does ToHash::Simple[:everything] | |||
personally I'm always keeping in mind that not all my data models come from databases, so I want a solution that works generally | |||
vrurg | Oh, no. I just've done sufficiently featureful Config::BINDish and need to focus on other things | ||
Altreus | API::Discord, for example, already uses a JSON API as its data source | ||
So to-json means something different when I'm communicating with Discord compared to if I were to put a web API on that | 15:18 | ||
15:27
xinming_ joined
15:29
xinming left
15:30
abraxxa left
|
|||
SmokeMachine__ | Altreus: maybe something like this? usercontent.irccloud-cdn.com/file/.../image.png | 15:43 | |
Altreus | actually that's quite useful, being able to specify certain values and also have the others filled in | 15:44 | |
SmokeMachine__: hey, you could error if it asked for an attr that isn't on the obj, even if it's given a value | 15:45 | ||
that way you're sure you're not just leaving legacy code lying around | 15:46 | ||
Say you completely removed password auth for some reason, then it would say, not gonna give you password, even though you specified a value for it | |||
SmokeMachine__ | but what id you want to change the name of it? or create a completely new one (as the :name one?) | 15:47 | |
Altreus | ah hrm, but then &value would fail if it asked for a nonexistent thing | 15:48 | |
you could change the name of it with password => *.pass | 15:49 | ||
or such | |||
eh, IDK, you might be right | |||
Feels like overkill | |||
now it's almost a format-hash method :D | |||
also it doesn't have to be on the object, which is nice | 15:50 | ||
16:30
evalable6 left,
linkable6 left
16:32
evalable6 joined
|
|||
SmokeMachine__ | Altreus: my last version, if someone is interested: usercontent.irccloud-cdn.com/file/.../image.png | 16:42 | |
Altreus | hey I like lens | 16:43 | |
SmokeMachine__: this is a fun algo but my brain is refusing to process it | 16:44 | ||
I'm gonna leave it open for later | |||
16:46
melezhik joined
|
|||
melezhik | . | 16:46 | |
16:48
dakkar left
|
|||
Altreus | ! | 16:50 | |
17:06
xinming_ is now known as xinming
|
|||
melezhik | how can I get a source code of Raku program when run `raku -e ' ...' `? | 17:07 | |
xinming | What is the official dbmopen implementation for rakudo ? | 17:09 | |
Today, I thought that, can we have a database where all keys are in memory, but all data are on the disk? | 17:10 | ||
Hmm, I know it's doable, What I mean is, wether we already have the module for this. ;-) | |||
lizmat | melezhik: there is no official interface for that | 17:20 | |
unofficially, there is Rakudo::Internals.PROGRAM | 17:21 | ||
maybe we should expose that somehow | |||
melezhik | lizmat++ | 17:24 | |
17:29
jess joined
|
|||
lizmat clickbaits rakudoweekly.blog/2021/09/13/2021-37-receding/ | 17:43 | ||
melezhik: %*COMPILING<%?OPTIONS><e> might be a less brittle thing to depend on | 17:48 | ||
although that also appears to be an implementation detail | 17:52 | ||
maybe I should just make a module for it | 17:54 | ||
17:55
immediate joined
|
|||
immediate | m: say [5, 12, 13]>>.WHAT | 17:57 | |
camelia | (Array) | ||
immediate | m: say [5, 12, 13]>>.&WHAT | ||
camelia | [(Int) (Int) (Int)] | ||
immediate | Hello, why we need &? and what does it do when we don't use &? | 17:58 | |
17:58
melezhik left
18:03
reportable6 left
|
|||
lizmat | immediate: intriguing, I guess it's because .WHAT is basically a macro | 18:04 | |
but it feels incorrect indeed... | 18:05 | ||
18:05
patrickb joined
18:23
keutoi left
18:30
linkable6 joined
19:05
reportable6 joined
|
|||
immediate | thank you | 19:12 | |
xinming | immediate: seems like a bug | 19:15 | |
immediate | Is it specific to WHAT? WHICH gives a different result | 19:18 | |
m: say [5, 12, 13]>>.WHICH | |||
camelia | [Int|5 Int|12 Int|13] | ||
immediate | m: say [5, 12, 13]>>.&WHICH | 19:19 | |
camelia | 5===SORRY!5=== Error while compiling <tmp> Undeclared name: WHICH used at line 1 |
||
lizmat | m: dd WHICH 42 | 19:22 | |
camelia | 5===SORRY!5=== Error while compiling <tmp> Undeclared name: WHICH used at line 1 |
||
19:22
patrickb left
|
|||
lizmat | that's because there is no sub WHICH in the core, but there not a sub WHICH | 19:24 | |
that's because there is no sub WHICH in the core, but there *is* a sub WHAT | |||
19:51
cognominal left
19:54
Manifest0 left
20:12
Manifest0 joined
20:17
Manifest0 left
20:32
Manifest0 joined
20:42
abraxxa-home joined
20:45
abraxxa-home left
20:51
Manifest0 left
|
|||
immediate | i see thank you | 20:54 | |
does it not make sense to have WHICH as a sub | 20:55 | ||
japhb | I'm not entirely sure why *WHAT* is a sub ... | 21:01 | |
moritz_ | probably so you can .map(&WHAT)? | 21:03 | |
gfldex | immediate: many month ago I asked that question in #perl6-dev (many many months ago) and this is by design. In some places it's the only way to find out what a thing is. | 21:08 | |
immediate | gfldex: Did you mean WHICH question? and "it" in your second sentence refers to "by design"? | 21:13 | |
gfldex | The bahaviour of .WHAT is by design. | 21:14 | |
japhb | moritz_: I'd write that as .map(*.WHAT) anyway I think | ||
moritz_ | but then .WHAT needs to be a real method as well, not a macro | 21:15 | |
m: class A { method WHAT() { 'X' }; say A.WHAT | |||
camelia | 5===SORRY!5=== Error while compiling <tmp> Missing block at <tmp>:1 ------> 3ss A { method WHAT() { 'X' }; say A.WHAT7⏏5<EOL> expecting any of: postfix statement end statement modifier stat… |
||
moritz_ | m: class A { method WHAT() { 'X' }}; say A.WHAT | 21:16 | |
camelia | (A) | ||
moritz_ | if that were the case, the line above should return X, not A | ||
japhb | moritz_: Why would we support override of WHAT? | 21:17 | |
21:18
Manifest0 joined
|
|||
japhb | m: .say for (3, "b").map(*.WHAT) | 21:18 | |
camelia | Cannot map a List using 'Whatever' Did a * (Whatever) get absorbed by a list? in block <unit> at <tmp> line 1 |
||
japhb | Oh interesting | ||
gfldex | I don't think we have a name for the things that are like .WHAT . | ||
japhb | I figured that it would macroize the WhateverCode, but I guess not. | 21:19 | |
gfldex | `$foo.do-stuff` <-- what kind of thing is `.`? | ||
I link to think about those things as grammar- or AST-level operators. So `.WHAT` is a "postfix at compile time". | 21:21 | ||
s/link/like/ | |||
21:25
immediate left
|
|||
tonyo | isn't that the gist of a macro? | 21:26 | |
gfldex | The macros we have right now are written like a sub. Is a sub an operator? | 21:27 | |
japhb | gfldex: Are you asking that in the type-theoretic sense or the Raku practical sense? | 21:29 | |
gfldex | In a natural language sense. Because we are talking about it and have difficulty to name the catigory. | 21:31 | |
Actually, natural language is hard. Let's stick with Raku. :D | 21:34 | ||
21:38
melezhik joined
|
|||
melezhik | is raku `dir()` function keeps it state? | 21:38 | |
github.com/melezhik/topsdevops/blo...ku#L18-L20 | |||
this 2 lines returns the same results even though content of directories change across requests | 21:39 | ||
gfldex | melezhik: the function itself doesn't but the c-level stuff it uses does | ||
melezhik | they only give another result when I restart my cro app | ||
so, how can I "flush" dir state? | 21:40 | ||
gfldex | however, keeping that state around for to long might result in strange errors | ||
melezhik | I don't need to keep state, here is the thing )) | ||
gfldex | dir returns a list. The state is bound to that list. If you call dir() again you get a fresh list with it's own state | ||
melezhik | I expect dir() is called per every cro request ... | 21:41 | |
oh, it is not ... | |||
only now noticed it is not under a certain router | 21:42 | ||
that explains the behavior )))) | |||
thanks for thinking with me gfldex )))) | |||
21:52
melezhik left
|
|||
tonyo | gfldex: it's still a macro, syntax doesn't preclude something from being a macro | 21:53 | |
22:52
linkable6 left,
evalable6 left
22:54
RakuIRCLogger left
22:55
TempIRCLogger left,
evalable6 joined
22:56
linkable6 joined,
Geth left,
lizmat left
23:00
lizmat joined,
TempIRCLogger joined
23:01
Geth joined
23:37
bronco_creek joined
23:38
bronco_creek joined
23:40
bronco_creek left
23:42
bronco_creek left
|