00:00:29 | FromDiscord | <!Patitotective> stacklang is the definition of text |
00:00:34 | FromDiscord | <!Patitotective> (edit) "stacklang is the definition of text ... " added "https://github.com/PMunch/stacklang" |
00:27:12 | FromDiscord | <!Patitotective> or i can copy this lol https://github.com/KatrinaKitten/honeycomb/blob/master/tests/test.nim#L698 |
00:42:10 | * | noeontheend quit (Ping timeout: 240 seconds) |
01:17:09 | * | arkurious quit (Quit: Leaving) |
01:42:24 | FromDiscord | <System64 ~ Flandre Scarlet> In reply to @Patitotective "ho would i evaluate": JavaScript be like |
01:42:49 | FromDiscord | <!Patitotective> In reply to @System64 "JavaScript be like": haha i actually copied that from js |
01:42:57 | FromDiscord | <System64 ~ Flandre Scarlet> ah alright lol |
01:44:38 | FromDiscord | <!Patitotective> i got it working using honeycomb https://katrinakitten.github.io/honeycomb https://media.discordapp.net/attachments/371759389889003532/975212078862303273/ImTemplate-2.mp4 |
01:50:13 | * | Lord_Nightmare quit (Quit: ZNC - http://znc.in) |
01:52:06 | * | Lord_Nightmare joined #nim |
02:22:36 | FromDiscord | <aph> damn |
02:26:17 | NimEventer | New thread by Elcritch: Fidgetty: themes ... ?, see https://forum.nim-lang.org/t/9155 |
02:40:11 | * | vicfred joined #nim |
04:02:51 | * | slowButPresent quit (Quit: ERC 5.4 (IRC client for GNU Emacs 28.1)) |
04:04:38 | * | Zectbumo joined #nim |
04:38:17 | * | duuude quit (Ping timeout: 248 seconds) |
06:23:15 | FromDiscord | <Rika> In reply to @Elegantbeef "Or consider using pmunch's": Yardanico has a math expression evaluator |
06:34:35 | FromDiscord | <Zectbumo> sent a code paste, see https://paste.rs/0IZ |
06:34:43 | FromDiscord | <Zectbumo> (edit) |
06:35:09 | FromDiscord | <Zectbumo> (edit) "https://play.nim-lang.org/#ix=3XOn" => "https://play.nim-lang.org/#ix=3XOm" |
06:37:38 | FromDiscord | <huantian> I mean that’s probably the best way |
06:38:04 | FromDiscord | <Phil> I don't know of any parseInt that allows for a default value if it fails.↵Best I can think of is maybe looking into "isEmptyOrWhitespace" but that does more than you might want it to (It would recognize " " as true which you didn't want) |
06:38:22 | FromDiscord | <Phil> (edit) "I don't know of any parseInt that allows for a default value if it fails.↵Best I can think of is maybe looking into "isEmptyOrWhitespace" ... but" added "for your initial check to use std-lib stuff," |
06:38:47 | FromDiscord | <Zectbumo> sent a code paste, see https://paste.rs/I5s |
06:38:48 | FromDiscord | <Elegantbeef> or just `echo try: parseint(str): except 0` |
06:39:32 | FromDiscord | <huantian> ~~Make a typed sql wrapper~~ |
06:40:25 | FromDiscord | <Zectbumo> In reply to @Elegantbeef "or just `echo try:": I tried this but I get invalid indentation |
06:40:32 | FromDiscord | <Phil> Surprisingly enough, getValue does not return an optional, huh |
06:40:35 | FromDiscord | <Phil> TIL |
06:41:01 | FromDiscord | <Zectbumo> right? they kinda force the "" |
06:41:17 | FromDiscord | <Rika> In reply to @Zectbumo "I tried this but": Missing colon after except |
06:41:19 | FromDiscord | <Rika> Add that |
06:41:20 | FromDiscord | <Phil> Write your own wrapper proc that does this properly |
06:41:28 | FromDiscord | <Phil> (edit) "Write your own wrapper proc that does this properly ... " added "and then you can deal with it from there" |
06:41:29 | FromDiscord | <Rika> Beef is old and forgetful |
06:41:51 | FromDiscord | <Rika> Also what the fuck beef you put the colon before except |
06:41:56 | FromDiscord | <Rika> Remove that too lol |
06:42:26 | FromDiscord | <Elegantbeef> single line expressions make me write bad code cause they're bad |
06:43:03 | FromDiscord | <Zectbumo> !eval echo try: "".parseInt except: 0 |
06:43:04 | NimBot | Compile failed: /usercode/in.nim(1, 6) Error: invalid indentation |
06:44:00 | FromDiscord | <Rika> In reply to @Elegantbeef "single line expressions make": Excuses lmao |
06:44:33 | FromDiscord | <huantian> Just make a parseIntOrDefault proc or something tbh |
06:44:52 | FromDiscord | <huantian> That’ll probably give the cleanest code |
06:44:59 | FromDiscord | <Zectbumo> oh "To prevent confusing code there is a parsing limitation; if the try follows a ( it has to be written as a one liner:" |
06:45:13 | FromDiscord | <Zectbumo> !eval echo (try: "".parseInt except: 0) |
06:45:15 | NimBot | Compile failed: /usercode/in.nim(1, 14) Error: undeclared field: 'parseInt' for type system.string [type declared in /playground/nim/lib/system.nim(34, 3)] |
06:45:36 | FromDiscord | <Zectbumo> (edit) "!eval ... echo" added "import std/strutils;" |
06:45:37 | FromDiscord | <Phil> Nimbot doesn't import strutils for you? |
06:45:39 | FromDiscord | <Phil> huh |
06:45:40 | FromDiscord | <Rika> Import the package first, not there by default |
06:45:42 | FromDiscord | <Rika> No |
06:45:46 | FromDiscord | <Zectbumo> !eval import std/strutils; echo (try: "".parseInt except: 0) |
06:45:47 | FromDiscord | <Rika> Nothing is imported by default |
06:45:49 | NimBot | 0 |
06:46:43 | FromDiscord | <Zectbumo> thanks @ElegantBeef |
06:47:19 | FromDiscord | <huantian> Though do note that’ll catch all paraeInt fails |
06:52:32 | FromDiscord | <Phil> sent a long message, see http://ix.io/3XOr |
06:52:48 | FromDiscord | <Phil> (edit) "http://ix.io/3XOr" => "http://ix.io/3XOs" |
06:56:09 | FromDiscord | <Elegantbeef> distincts |
06:57:46 | FromDiscord | <Phil> You mean make the newHook procs distinct somehow?↵I'm not sure how that'd work and how jsony would know which newHook proc to use when, they'd have the same name with the same parameters, just different behaviour |
07:03:34 | FromDiscord | <Elegantbeef> You want to have two hooks but the same internal structure yes? |
07:04:04 | FromDiscord | <Elegantbeef> If so you do `type MyOtherType = distinct MyType` then do `MyOtherType myType` or similar to convert when you want to parse/emit the specific json |
07:05:41 | FromDiscord | <Phil> OHHHHHHH |
07:06:08 | FromDiscord | <Phil> Like I could have `type CharacterUpdate = distinct Character` and have a newHook proc for that |
07:06:13 | FromDiscord | <Phil> that is really nice! |
07:08:19 | FromDiscord | <Elegantbeef> Welcome to a functional type system |
07:10:40 | FromDiscord | <Phil> My plan got foiled by the fact I can't actually start a newHook with a DB-entry since I can't query from within a `newHook`, or rather I don't have access to the parameters I'd need.... dangit |
07:11:39 | * | ltriant quit (Ping timeout: 240 seconds) |
07:19:17 | FromDiscord | <Phil> sent a code paste, see https://play.nim-lang.org/#ix=3XOu |
07:19:56 | FromDiscord | <Elegantbeef> Isnt that just have all your fields as optional? |
07:19:57 | FromDiscord | <Phil> (edit) "https://play.nim-lang.org/#ix=3XOw" => "https://paste.rs/Bz9" |
07:21:19 | FromDiscord | <Phil> They'd only be optional in the sense that the user might not send them for an HTTP PATCH request where they only want to update the `description` field of an entry.↵They are not optional in the sense that there MUST be a value.↵In the specific case of an HTTP-PATCH request I just already have a value for it |
07:21:29 | FromDiscord | <Phil> (edit) "They'd only be optional in the sense that the user might not send them for an HTTP PATCH request where they only want to update the `description` field of an entry.↵They are not optional in the sense that there MUST be a value.↵In the specific case of an HTTP-PATCH request I just already have a value for it ... " added "in the database and will keep it." |
07:21:47 | FromDiscord | <Phil> (edit) "that" => "of the Database, aka" |
07:22:10 | FromDiscord | <Phil> (edit) "it" => "them" |
07:22:18 | FromDiscord | <Phil> (edit) "it." => "it unchanged." |
07:22:27 | FromDiscord | <Elegantbeef> This is the benefit of JsonNode gives you |
07:23:07 | FromDiscord | <Phil> Fair, that was my first approach, I guess I should go back to implementing that one, seems to be a case tailor made for it |
08:01:16 | FromDiscord | <planetis> I have written something similarities before https://github.com/planetis-m/breakout/blob/master/breakout/loadasset.nim |
08:02:01 | FromDiscord | <planetis> Thing is it crashes if fields are not in the correct order |
08:03:23 | FromDiscord | <planetis> I have seen others storing the results in temporaries first to make it work |
08:05:00 | FromDiscord | <planetis> https://github.com/tandy-1000/uniony |
08:05:12 | FromDiscord | <Phil> I'm doing a horrible amalgamation of tons of "when" clauses and handling all the various types my field on the object could have (which is luckily limited since it's representing something in a db-column and I don't deal with JSON) and going through all the possible node-kinds the JsonNode could have and either copying the value from the JsonNode over to the field or raising JsonParseErrors |
08:06:38 | FromDiscord | <planetis> You can't really replace JsonNode can you heh |
08:10:36 | * | ltriant joined #nim |
08:12:33 | FromDiscord | <Phil> Pretty much.↵I'm also basically covering all combinations of "Type I expect to have" and "possible JsonNodeKinds".↵Given I can have string, int, int64, float, bool as well as optionals of all of these.... I've got stuff to write |
08:12:49 | FromDiscord | <Phil> (edit) "expect to have"" => "have in model-object"" |
08:13:55 | FromDiscord | <Phil> I'll definitely need to refactor the spaghetti code I'm currently writing... assuming I find a better way |
08:14:03 | FromDiscord | <planetis> I am writing something similar https://github.com/planetis-m/packedjson2/issues/7 don't know how it performs yet |
08:14:50 | FromDiscord | <Phil> Holy damn |
08:15:20 | * | ltriant quit (Ping timeout: 248 seconds) |
08:17:51 | FromDiscord | <planetis> A_raq basically said just use packjson already, but I want to pursue it a little more |
08:31:43 | * | retropikzel joined #nim |
08:49:28 | FromDiscord | <voidwalker> https://media.discordapp.net/attachments/371759389889003532/975318992715644978/unknown.png |
08:51:00 | FromDiscord | <voidwalker> I have to store X tables like this, with n rows and 10~ columns (i know n before creating). In the previous implementation I used a dynamic array made of string[50] in pascal. What do you suggest I do here, for datatypes ? |
08:51:25 | FromDiscord | <voidwalker> storing everything in a 50 length string is inefficient, as some columns only contain one char, or a number 0..100 |
08:51:42 | FromDiscord | <voidwalker> especially since the rows can go into thousands |
08:52:02 | FromDiscord | <Elegantbeef> You could use an object variant based off the type held |
08:53:07 | FromDiscord | <voidwalker> a little more explicit please ? |
08:53:24 | FromDiscord | <Elegantbeef> sent a code paste, see https://play.nim-lang.org/#ix=3XOJ |
08:53:41 | FromDiscord | <Elegantbeef> that should be `intval: 0u8..100u8` 😄 |
08:54:01 | FromDiscord | <Elegantbeef> It's a tagged union so each entry will at most use 9 bytes |
08:54:21 | FromDiscord | <Elegantbeef> the data the string has is more of course |
08:54:48 | FromDiscord | <voidwalker> oh so you mean a record for the individual entries, i see... didn't consider this |
08:55:19 | FromDiscord | <Elegantbeef> https://nim-lang.org/docs/manual.html#types-object-variants fully explained here |
08:56:24 | FromDiscord | <voidwalker> so a row would be array[1..10, EntryKind] |
08:56:47 | FromDiscord | <Elegantbeef> `Entry` but yea |
08:57:30 | FromDiscord | <voidwalker> (edit) "so" => "sent" | "row would be array[1..10, EntryKind]" => "code paste, see https://play.nim-lang.org/#ix=3XOK" |
08:57:39 | FromDiscord | <voidwalker> (edit) "https://play.nim-lang.org/#ix=3XOK" => "https://play.nim-lang.org/#ix=3XOL" |
08:58:25 | FromDiscord | <voidwalker> ok, i will look up how to practically make use of this |
08:58:49 | FromDiscord | <voidwalker> And how about the rows themselves, how do I store just N of them in memory for each such table ? |
08:58:57 | FromDiscord | <voidwalker> since n varies from table to table |
08:59:16 | FromDiscord | <Elegantbeef> Use a sequence or similar if it's dynamic |
08:59:35 | FromDiscord | <voidwalker> n is static for a table, and i know it before I create the table |
08:59:43 | FromDiscord | <voidwalker> but varies between tables |
08:59:59 | FromDiscord | <Elegantbeef> Make a generic type so you can do it statically |
09:00:32 | FromDiscord | <Elegantbeef> `type Table[Columns: static int] = distinct array[Columns, Row]` |
09:01:05 | FromDiscord | <voidwalker> ok, what do I have to read up on this, I never used generics in any language |
09:01:30 | FromDiscord | <Elegantbeef> https://nim-lang.org/docs/manual.html#generics the generic docs will probably help |
09:02:59 | * | jmdaemon quit (Ping timeout: 240 seconds) |
09:05:52 | * | ltriant joined #nim |
09:05:53 | FromDiscord | <Elegantbeef> Generics just let you easily create contains for different types, in this case different sized arrays |
09:09:58 | FromDiscord | <Elegantbeef> containers and procs for different types\ 😄 |
09:09:59 | FromDiscord | <voidwalker> I know that, just trying to wrap my head around the code you presented. 'static' and 'distinct' are also new to me |
09:10:05 | FromDiscord | <voidwalker> A static statement/expression explicitly requires compile-time execution. Even some code that has side effects is permitted in a static block: |
09:10:57 | FromDiscord | <Elegantbeef> Static generic parameters are generics delimited by a value |
09:11:09 | FromDiscord | <Elegantbeef> IE `array[10,int] isnot array[9, int]` |
09:34:40 | NimEventer | New post on r/nim by insomniac_lemon: Runtime iterated variable names?, see https://reddit.com/r/nim/comments/uq2i0h/runtime_iterated_variable_names/ |
09:42:55 | FromDiscord | <voidwalker> I need more examples for generic types. And why doesn't yours have [T] @ElegantBeef ? |
09:43:11 | FromDiscord | <Elegantbeef> It's just a generic parameter name |
09:43:16 | FromDiscord | <Elegantbeef> It doesnt have to be `T` it can be whatever you want |
09:45:13 | FromDiscord | <jmgomez> Hey guys, any idea of how to check if a dynlib is open/being used? (it may be similar of a so file) |
09:46:38 | FromDiscord | <jmgomez> oh I think it can be done with dlopen |
09:48:20 | FromDiscord | <voidwalker> type Table[Columns: static int] = distinct array[Columns, Row] - ok it's been alost an hour and I still don't understand this. What are Columns and Row supposed to be in this context ? |
09:48:45 | FromDiscord | <voidwalker> I declare a const Columns = 10, since columns are constant ? |
09:49:09 | FromDiscord | <voidwalker> (edit) "alost" => "almost" |
09:51:43 | FromDiscord | <Rika> No you declare a type `Table[10]` |
09:51:56 | FromDiscord | <Rika> And now that table type has Columns set to 10 |
09:52:11 | FromDiscord | <Rika> Think of it as a “variable that’s local to a type” kind of? |
09:52:26 | FromDiscord | <voidwalker> not the same as const colN = 10 and Table[ColN] |
09:52:38 | FromDiscord | <voidwalker> (edit) "not the same as const colN = 10 and Table[ColN] ... " added "?" |
09:52:51 | FromDiscord | <Rika> Was that capitalisation mismatch intentional? |
09:53:02 | FromDiscord | <Rika> If it wasn’t, then they would be the same; constants are folded |
09:53:11 | FromDiscord | <voidwalker> (edit) "Table[ColN]" => "Table[colN]" |
09:53:36 | FromDiscord | <Rika> And only if that second part was a type usage and not the declaration |
09:53:56 | FromDiscord | <voidwalker> (edit) "not the same as const colN = 10 and ... Table[colN]" added "type" |
09:54:26 | FromDiscord | <Rika> So declaring a constant then a type Table[constantName: static something], the constant won’t be put in the type automatically |
09:54:26 | FromDiscord | <voidwalker> I thiink I ruined my brain trying to understand that line : \ |
09:54:51 | FromDiscord | <Rika> But if it’s a usage var a: Table[constantName] then it works |
09:56:00 | FromDiscord | <Rika> I’m on mobile so I have to carefully choose how to explain it (without code because xd what a pain to deal with keyboards on mobile) |
10:07:26 | FromDiscord | <jmgomez> sent a code paste, see https://play.nim-lang.org/#ix=3XOV |
10:11:54 | * | retropikzel left #nim (#nim) |
10:37:04 | * | duuude joined #nim |
10:44:02 | * | Zectbumo quit (Remote host closed the connection) |
11:25:44 | * | oprypin quit (Ping timeout: 260 seconds) |
11:26:51 | * | pro joined #nim |
11:38:02 | * | pch quit (Ping timeout: 246 seconds) |
12:32:26 | * | slowButPresent joined #nim |
12:33:42 | FromDiscord | <Andreas> would anybody pls. sho we how one can a finalizer-proc to a variant-type using `new[T](a: var ref T; finalizer: proc (x: ref T)` - if it is possible at all ? |
12:33:53 | FromDiscord | <Andreas> (edit) "sho we" => "show me" |
12:34:07 | FromDiscord | <Andreas> (edit) "it" => "that" |
12:34:58 | FromDiscord | <Andreas> (edit) "would anybody pls. show me how one can ... a" added "add" |
12:35:13 | FromDiscord | <Andreas> (edit) "how one can" => "how-to" |
12:35:39 | FromDiscord | <Rika> You just add it? What do you mean? What’s the issue you were having |
12:35:45 | FromDiscord | <Rika> When you tried |
12:38:25 | FromDiscord | <Andreas> sent a code paste, see https://play.nim-lang.org/#ix=3XPb |
12:38:43 | FromDiscord | <Andreas> (edit) "https://play.nim-lang.org/#ix=3XPb" => "https://paste.rs/36T" |
12:43:39 | FromDiscord | <demotomohiro> https://nim-lang.org/docs/system.html#new,ref.T,proc(ref.T)↵First parameter of that `new` is `ref Test` type variable. |
12:43:44 | FromDiscord | <Rika> a is an instance of your type |
12:43:46 | FromDiscord | <Rika> Not the type |
12:45:30 | * | pro quit (Quit: pro) |
12:46:40 | FromDiscord | <demotomohiro> sent a code paste, see https://play.nim-lang.org/#ix=3XPd |
12:48:47 | FromDiscord | <federico3> raising any exception in a proc implies RootEffect ? |
12:51:43 | * | oprypin joined #nim |
13:06:57 | FromDiscord | <Phil> In reply to @Elegantbeef "This is the benefit": Actually, finally finished that approach!↵I'm... well, I'm happy it works, but I feel like it isn't really the most readable code I've ever written. |
13:08:26 | FromDiscord | <Phil> I ended up writing like half a dozen templates and copious amounts of `raise newException` if the model wanted a type that I could not possibly get out of the given JsonNode based on its JsonNodeKind.↵↵If anyone wants to give some pointers on what I could improve, I've opened a question on stackexchange codereview:↵https://codereview.stackexchange.com/questions/276555/transferring-values-from-a-json-string-into-an-object-instance-in-ni |
13:08:44 | FromDiscord | <Phil> (edit) "the model" => "a field" | "a fieldwanted ... a" added "a value of" |
13:09:12 | FromDiscord | <Phil> Sidenote, NimEventer does not monitor stackexchange codereview as I've come to realize |
13:39:32 | FromDiscord | <Andreas> sent a code paste, see https://play.nim-lang.org/#ix=3XPm |
13:40:09 | FromDiscord | <Andreas> (edit) "https://play.nim-lang.org/#ix=3XPm" => "https://play.nim-lang.org/#ix=3XPn" |
13:40:57 | FromDiscord | <Andreas> (edit) "https://play.nim-lang.org/#ix=3XPn" => "https://paste.rs/uo5" |
13:41:20 | FromDiscord | <Andreas> (edit) "https://paste.rs/NeC" => "https://play.nim-lang.org/#ix=3XPo" |
13:41:54 | FromDiscord | <Rika> sent a code paste, see https://play.nim-lang.org/#ix=3XPp |
13:54:35 | FromDiscord | <Phil> sent a code paste, see https://play.nim-lang.org/#ix=3XPw |
13:54:54 | FromDiscord | <Phil> (edit) "https://play.nim-lang.org/#ix=3XPw" => "https://paste.rs/BI0" |
13:55:09 | FromDiscord | <Rika> does that not work |
13:55:29 | FromDiscord | <Phil> sent a code paste, see https://play.nim-lang.org/#ix=3XPx |
13:56:11 | FromDiscord | <Rika> `(wolf[]).fieldPairs` |
13:56:14 | FromDiscord | <Rika> sorry] |
13:56:25 | FromDiscord | <Rika> `wolf[].fieldPairs` parens not neede |
13:56:25 | FromDiscord | <Phil> What do the "[]" do? |
13:56:26 | FromDiscord | <Rika> (edit) "neede" => "needed" |
13:56:28 | FromDiscord | <Rika> dereference |
13:56:34 | FromDiscord | <Phil> OHHHHHHH |
13:56:37 | FromDiscord | <Phil> That's why this works |
13:56:43 | FromDiscord | <Phil> I've seen this before and was so damn confused |
14:01:12 | FromDiscord | <Phil> Can you always just dereference a `ref object` to use a proc that expects an `object` parameter? |
14:01:19 | FromDiscord | <Phil> (edit) "parameter?" => "parameter, or are iterators special?" |
14:01:52 | FromDiscord | <Phil> I'm asking since the iterators according to the docs expect tuples/objects most of the time |
14:02:01 | FromDiscord | <Phil> (edit) "I'm asking since the iterators according to the docs expect tuples/objects most of the time ... " added "and none of them explicitly expects a ref object type" |
14:04:20 | FromDiscord | <Generic> yes I think so |
14:09:02 | FromDiscord | <demotomohiro> You can use `[]` to dereference `ref object` and pass it to procs that takes `object` as long as it is not nil. |
14:09:03 | FromDiscord | <Rika> fields is special since its not a real iterator |
14:14:25 | FromDiscord | <Phil> sent a code paste, see https://paste.rs/loh |
14:14:40 | FromDiscord | <Phil> (edit) "https://paste.rs/dLR" => "https://play.nim-lang.org/#ix=3XPG" |
14:15:52 | NimEventer | New question by Philipp Doerner: How do I iterate over the fields of a ref object in nim?, see https://stackoverflow.com/questions/72249059/how-do-i-iterate-over-the-fields-of-a-ref-object-in-nim |
14:16:29 | FromDiscord | <Phil> Fun fact, I'm not even 6 months into the language and already I've started googling my own SO questions to nim |
14:17:35 | FromDiscord | <Rika> interesting strategy ngl |
14:17:55 | FromDiscord | <Rika> i dont think ive ever needed to do something similar |
14:18:46 | FromDiscord | <Phil> if norm didn't force ref types onto me with Models I don't think I would either |
14:19:26 | * | arkurious joined #nim |
14:19:52 | FromDiscord | <Phil> But since it does and model-instances are basically the bread and butter of my web application, I end up doing a whole bunch of things with ref-types that I otherwise would've done with value types |
14:20:10 | FromDiscord | <Rika> i mean, use SO quesitons |
14:20:17 | FromDiscord | <Phil> Oh, that, fair |
14:20:37 | FromDiscord | <Phil> Before nim I used them more for actually getting my problems solved |
14:21:03 | FromDiscord | <Phil> But with nim I just knew I needed something I could google because it'd soon be more than I could keep in my head for prolonged periods of time |
14:22:03 | FromDiscord | <Phil> Particularly doing a whole bunch of stuff with types at compile time is its own dangerous dance with the devil |
14:22:29 | FromDiscord | <Phil> I'd already forgotten how to get the inner type of an option at compile time when I remembered that I'd faced that issue once before and back then leorize helped me find the answer |
14:28:27 | FromDiscord | <Rika> In reply to @Isofruit "I'd already forgotten how": .get? or you really mean inner type |
14:29:18 | FromDiscord | <Phil> The actual type inside the optional from just the optional typedesc.↵That's `genericParams(fieldValue.type()).get(0)` |
14:29:40 | FromDiscord | <Phil> fieldValue = the parameter with the typedesc[Option[<SomeType>]] |
14:30:25 | FromDiscord | <Rika> does `typeof(option).T` not work? |
14:30:36 | FromDiscord | <Rika> (edit) "`typeof(option).T`" => "`typeof(valueThatIsOption).T`" |
14:30:46 | FromDiscord | <Rika> !eval import std/options; var a: Option[int]; echo typeof(a).T |
14:30:48 | NimBot | int |
14:30:55 | FromDiscord | <Phil> Let me check if that lets my program compile |
14:31:13 | FromDiscord | <Rika> if its a typedesc then you dont need to typeof |
14:32:08 | FromDiscord | <Phil> Huh, that also works |
14:32:57 | FromDiscord | <Phil> In fact, even `fieldValue.T` does it (fieldValue is from an iterator over a Model-type) |
14:33:24 | FromDiscord | <Phil> I'll add that as an additional response to the question |
14:33:31 | FromDiscord | <Rika> yeah you can access generic parameters as long as you know their name |
14:33:53 | FromDiscord | <Rika> which is why i dont like it when people name their parameters T |
14:34:10 | FromDiscord | <Rika> probably should follow c++ (gasp) in this sense |
14:59:03 | FromDiscord | <Phil> In reply to @Rika "probably should follow c++": As someone that never touched C++, I assume they give their generic types proper names? |
14:59:10 | FromDiscord | <Rika> they do |
14:59:24 | FromDiscord | <!Patitotective> how could i get the indexes of the matches of `findAll`? https://nim-lang.org/docs/re.html#findAll%2Cstring%2CRegex%2Cint |
15:00:15 | FromDiscord | <Phil> Hmm fair, I do like that one. I already do this in fact for my procs that generate prologue-handler-procs, just not anywhere else. |
15:06:13 | FromDiscord | <huantian> In reply to @Patitotective "how could i get": Make your own version, probably |
15:06:40 | FromDiscord | <huantian> Wait no that’s the regex find all, can you even do that with regex |
15:08:13 | * | arkt8 quit (Quit: Leaving.) |
15:08:19 | FromDiscord | <huantian> Maybe there’s a function I don’t know about but you’d probably have to modify the findAll iterator |
15:09:18 | FromDiscord | <!Patitotective> i have a string like this `=A2+2+F89` so i want to get `@[("A2", 1), ("F89", 6)]` |
15:09:45 | FromDiscord | <Rika> whats your regex |
15:09:51 | * | arkt8 joined #nim |
15:10:12 | FromDiscord | <!Patitotective> `([A-Za-z])([0-9]{1}|[0-9]{2})` |
15:12:09 | FromDiscord | <!Patitotective> actually it can be `([A-Za-z])([0-9]{1,2})` |
15:16:18 | FromDiscord | <gmag> Hello 🖐️ 🤓 ↵I'm so excited with Nim! I come from a Python background and immediately tried to play with nimpy and nimporter (kudos to the devs, wonderful packages!). I was wondering how easy/difficult would be integrate numpy arrays, maybe I missed some pertinent documentation on that matter, perhaps someone may kindly give me some pointers. |
15:21:12 | FromDiscord | <Phil> In reply to @gmag "Hello 🖐️ 🤓 ": I sadly can't offer much here, I assume the integration would be necessary due to an existing codebase using numpy arrays? |
15:23:11 | * | arkt8 left #nim (#nim) |
15:23:44 | FromDiscord | <gmag> In reply to @Isofruit "I sadly can't offer": Yes indeed, but also because numpy is sort of the bread and butter for scientific stuff and the glue to integrate with other packages in the Python ecosystem |
15:25:05 | FromDiscord | <Phil> Is the goal to generate packages to use in python? |
15:25:09 | FromDiscord | <Phil> (edit) "Is the goal to generate packages ... to" added "with nim" |
15:31:00 | FromDiscord | <gmag> yes, that's the idea. I have an example repo (based on nimporter examples) that does really the basics (https://github.com/gmagno/nym). And I'm now thinking how to expose a numpy array. This is mostly for fun purposes, there is no goal in mind yet. |
15:32:38 | NimEventer | New thread by Stoneface86: How to add custom links in doc gen?, see https://forum.nim-lang.org/t/9156 |
15:33:07 | FromDiscord | <gmag> I've used Pybind11 in the past and the interoperability is really interesting. It would be fantastic to reach that kind interoperability in Nim |
15:33:47 | FromDiscord | <Phil> Rika, did you play around with importing python into nim? |
15:39:02 | FromDiscord | <root> how do i import my own python files into my nim project? I know how to import external libraries but not my own .py files :/ |
15:39:04 | FromDiscord | <Phil> In reply to @gmag "I've used Pybind11 in": Should currently you be unable to find somebody that has played around a bit more with python/nim interop, I'd highly recommend throwing up a topic in the nim forum.↵And if you're feeling very generous, you can even write up self-answered question on SO with your results (it's what I currently do whenever I solve something that stops me for a bit) |
15:41:02 | FromDiscord | <Phil> I've written a decent amount of python in webdev, so I can talk with you regarding how you can express certain things that you do in python in nim, but that's around it. My current webdev project is pretty much reimplementing my python code for funsies and ego (since nim provides hilarious levels of speed-up) |
15:43:58 | FromDiscord | <xflywind> I used nimpy before: https://github.com/yglukhov/nimpy when I need some procs from opencv-python. |
15:46:48 | FromDiscord | <gmag> @Phil Thanks, I appreciate the feedback and time. I will definitely continue sharing my findings. |
15:47:08 | FromDiscord | <xflywind> See also https://github.com/yglukhov/nimpy#troubleshooting-qa |
15:47:25 | FromDiscord | <Yardanico> yeah nimpy is the way to go |
15:48:14 | FromDiscord | <xflywind> (edit) "See also https://github.com/yglukhov/nimpy#troubleshooting-qa ... " added " "Is there any numpy compatibility"?" |
15:48:59 | FromDiscord | <xflywind> It seems that https://github.com/SciNim/scinim/blob/main/scinim/numpyarrays.nim provides numpy interoperability. |
15:49:07 | FromDiscord | <Rika> In reply to @Isofruit "Rika, did you play": No |
15:49:23 | FromDiscord | <Rika> I never did any Python Nim interoperation |
15:49:26 | FromDiscord | <xflywind> > nimpy allows manipulating numpy objects just how you would do it in Python, however it is not much more efficient. scinim offers API for performance critical numpy interop, and it is advised to consider it first.↵> ↵> Nimpy also exposes lower level Buffer protocol, see raw_buffers.nim. tpyfromnim.nim contains a very basic test for this. |
15:50:40 | NimEventer | New thread by Morturo: Problem with --threads:on, see https://forum.nim-lang.org/t/9157 |
15:52:23 | FromDiscord | <Phil> In reply to @flywind "It seems that https://github.com/SciNim/scinim/blob": Ohhh I saw the thread when scinim was published, the fact they have that interop is pretty cool |
15:53:03 | FromDiscord | <xflywind> Yeah, they are awesome! |
15:54:01 | FromDiscord | <Phil> In reply to @gmag "<@180601887916163073> Thanks, I appreciate": Expanding on xflywind's plugging of scinim, it appears they also have a gitter:↵https://gitter.im/SciNim/community |
15:54:12 | FromDiscord | <Yardanico> no need for a gitter |
15:54:14 | FromDiscord | <Yardanico> #science |
15:54:41 | FromDiscord | <Phil> Sometimes I forget that I have like 80% of the channels on here muted, yeah science is likely also a pretty good resource |
15:54:50 | FromDiscord | <Yardanico> In reply to @Isofruit "Sometimes I forget that": wdym "likely" |
15:54:54 | FromDiscord | <Yardanico> it's literally bridged to the gitter :D |
15:54:59 | FromDiscord | <gmag> ah |
15:55:02 | FromDiscord | <Phil> It is? nice! |
15:55:03 | FromDiscord | <gmag> fantastic! |
15:55:04 | FromDiscord | <Yardanico> and matrix (but gitter is matrix too anyway) |
15:55:23 | FromDiscord | <Yardanico> no one actually uses gitter for science it seems, mostly matrix or discord |
16:06:15 | * | PMunch joined #nim |
16:16:27 | * | duuude quit (Ping timeout: 240 seconds) |
16:18:44 | * | xet7 quit (Remote host closed the connection) |
16:19:52 | * | xet7 joined #nim |
16:27:54 | FromDiscord | <eyecon> Is it good form to shadow the proc parameters to make some adjustments? Like, a short form is possible but I have to expand it first, and to avoid having two procs I just expand it at the beginning and overwrite the user-given proc parameter? If not, how else would you do it? |
16:29:34 | FromDiscord | <eyecon> sent a code paste, see https://play.nim-lang.org/#ix=3XQw |
16:31:00 | FromDiscord | <Yardanico> yeah it's totally fine if you shadow the proc arguments by modifying them into new variables |
16:31:23 | FromDiscord | <Yardanico> in fact you can even (ab?)use `sink` for that |
16:31:50 | FromDiscord | <Yardanico> `sink` is meant for move semantics and it's an annotation that prevents a copy when an argument that is being passed to the proc is not used afterwards |
16:31:54 | FromDiscord | <Yardanico> in other cases `sink` just returns a copy |
16:32:23 | FromDiscord | <Yardanico> but the main part is that `sink`'d arguments are mutable so you don't need to redeclare them and can instead modify them directly |
16:32:55 | FromDiscord | <Yardanico> I honestly don't know if it's okay to use `sink` that way, but I did use it for that myself and seen some other people do the same :) |
16:33:45 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XQx |
16:34:25 | FromDiscord | <Yardanico> and don't worry, `sink` works with refc GC as well, it's just that there it always copies |
16:34:31 | FromDiscord | <eyecon> Thanks. I cannot find a documentation about `sink` except hooks, where can I read more about this? |
16:34:40 | FromDiscord | <Yardanico> https://nim-lang.org/docs/destructors.html#sink-parameters |
16:35:17 | * | duuude joined #nim |
16:36:12 | FromDiscord | <Yardanico> Anyway, if you don't want to use somewhat "obscure" features like this you can just shadow proc arguments, it's completely acceptable. |
16:36:28 | FromDiscord | <eyecon> Thanks, will read about them |
16:42:07 | * | pch joined #nim |
16:52:31 | PMunch | Oh this is weird |
16:52:44 | PMunch | I have a macro which takes a uint8 and varargs[untyped] |
16:53:02 | PMunch | If I call that from a template it fails to find the macro |
16:53:15 | PMunch | Marking the template as dirty makes it work |
17:01:56 | FromDiscord | <!Patitotective> sus ඞ |
17:03:44 | PMunch | Yeah it's doing a couple of these really weird things.. |
17:11:35 | FromDiscord | <treeform> In reply to @Isofruit "<@107140179025735680> Question regarding": You can do this with a 2 line parse hook: |
17:11:57 | FromDiscord | <treeform> sent a code paste, see https://play.nim-lang.org/#ix=3XQE |
17:13:04 | FromDiscord | <treeform> 1 line 🙂 |
17:13:05 | FromDiscord | <treeform> sent a code paste, see https://paste.rs/xCe |
17:16:29 | FromDiscord | <Phil> sent a code paste, see https://play.nim-lang.org/#ix=3XQI |
17:17:28 | FromDiscord | <Phil> My intended control flow is↵Http Patch request --> Query entry from Db --> update values from entry with whatever is in the json --> save updated entry to DB |
17:17:48 | FromDiscord | <Phil> (edit) "My intended control flow is↵Http Patch request ... -->" added "with entry-id + some key-value pairs in JSON format" |
17:18:18 | FromDiscord | <treeform> you could do a sqlQuery inside the newHook? |
17:18:31 | FromDiscord | <Phil> Yeh but I don't have access to the ID that I want to use to query |
17:18:43 | FromDiscord | <Phil> That is unless I generate the newHook with the ID that I receive at runtime |
17:18:53 | FromDiscord | <treeform> just a moment parse hook would do the job |
17:18:53 | FromDiscord | <Phil> And I'm not sure that works |
17:21:40 | FromDiscord | <treeform> A little more complex as you need to parse the object twice: |
17:21:48 | FromDiscord | <treeform> sent a code paste, see https://play.nim-lang.org/#ix=3XQK |
17:22:38 | FromDiscord | <Phil> My scenario is even more messed up than that.↵You get the id not via the json, in the json are only the fields you want to update and nothing else.↵The id you receive as a path-parameter from the HTTP-Request-URL |
17:23:37 | PMunch | Now I'm getting some really weird type issues.. |
17:23:37 | FromDiscord | <Phil> That is, assuming I do not touch anything in my frontend.↵The alternative would be adding the id to the JSON that is being sent and then I could do it with a parsehook |
17:25:18 | * | jmdaemon joined #nim |
17:27:42 | FromDiscord | <treeform> In reply to @Isofruit "My scenario is even": Use new hook as a closure with an external id? |
17:28:40 | FromDiscord | <treeform> it does not appear to work due to nim's polymorphism rules |
17:28:43 | * | krux02 joined #nim |
17:34:10 | * | jmd_ joined #nim |
17:34:54 | * | jmdaemon quit (Ping timeout: 252 seconds) |
17:36:07 | FromDiscord | <treeform> using globals would be easy, but I don't think that is what you want |
17:40:13 | FromDiscord | <treeform> this is the best I got |
17:40:15 | FromDiscord | <treeform> sent a code paste, see https://play.nim-lang.org/#ix=3XQO |
17:40:29 | FromDiscord | <treeform> don't know how to make generation of merge without macros |
17:50:29 | FromDiscord | <iamtakingithard> sent a code paste, see https://play.nim-lang.org/#ix=3XQQ |
17:55:49 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XQR |
17:56:01 | FromDiscord | <Yardanico> anyway, any reason you're asking for the complete code instead of trying to do it yourself first? 🤔 it's good for learning |
17:57:10 | FromDiscord | <Yardanico> @iamtakingithard hallo |
17:59:11 | NimEventer | New thread by Solomonthewise: Interesting proposal for Error handling and Null through unified option Type., see https://forum.nim-lang.org/t/9158 |
18:00:07 | FromDiscord | <treeform> sent a code paste, see https://play.nim-lang.org/#ix=3XQT |
18:00:08 | FromDiscord | <System64 ~ Flandre Scarlet> okay so Nim cannot run on Windows 2000 |
18:00:51 | FromDiscord | <Yardanico> In reply to @treeform "this is what I": i guess this is closer to his code (except the main function) than mine 🤔 |
18:00:56 | FromDiscord | <Yardanico> also you don't need .items for toSeq |
18:01:03 | FromDiscord | <Yardanico> toSeq iterates by itself if items is defined for the variable |
18:01:07 | FromDiscord | <treeform> did not know that |
18:06:12 | FromDiscord | <Yardanico> and @iamtakingithard was never heard again... |
18:08:58 | * | kenran joined #nim |
18:11:43 | FromDiscord | <iamtakingithard> In reply to @Yardanico "and <@790153860130799616> was": I was busy with talking irl friend, xd |
18:11:53 | FromDiscord | <iamtakingithard> In reply to @treeform "this is what I": Thank you! |
18:12:03 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XQW |
18:12:18 | FromDiscord | <Yardanico> but any reason you wanted to see others make this thing, and not try yourself? just curious as that's a pretty weird request |
18:13:11 | FromDiscord | <Yardanico> this code is pretty simple and it translates quite close from Python to Nim |
18:13:13 | FromDiscord | <Andreas> how can a get the ref to a variant-type ? |
18:13:38 | FromDiscord | <Yardanico> In reply to @Andreas "how can a get": wdym? it's no different than any other normal objects |
18:13:46 | FromDiscord | <iamtakingithard> In reply to @Yardanico "this code is pretty": I am more of uh visual learner. If i can see the differences between Python and Nim one I would know what to use. |
18:13:56 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XQX |
18:14:06 | FromDiscord | <Yardanico> In reply to @iamtakingithard "I am more of": i doubt that these examples will really help you to learn Nim, but that's just my opinion |
18:14:41 | FromDiscord | <root> how do i import my own .py files into my nim project with nimpy? |
18:14:44 | FromDiscord | <Yardanico> Python and Nim are actually quite different, "visual" differences won't be enough :) |
18:15:07 | FromDiscord | <iamtakingithard> In reply to @Yardanico "Python and Nim are": well, there's section nim for python programmers |
18:15:29 | FromDiscord | <Yardanico> yes, but it just shows some of the simple differences |
18:15:57 | FromDiscord | <Yardanico> a lot of nim concepts don't exist in Python at all, and a lot of idioms that do exist in both languages are much less frequently used in Nim than in Python |
18:16:26 | FromDiscord | <Yardanico> In reply to @iamtakingithard "well, there's section nim": also, keep in mind that this wiki page is community-contributed, it's not official documentation |
18:18:22 | FromDiscord | <Yardanico> In reply to @root "how do i import": something like https://github.com/yglukhov/nimpy/issues/255#issuecomment-1053706906 |
18:18:43 | FromDiscord | <Andreas> sent a code paste, see https://play.nim-lang.org/#ix=3XQZ |
18:18:50 | FromDiscord | <Yardanico> In reply to @Andreas "hi, well with variants,": huh? |
18:18:57 | FromDiscord | <Andreas> (edit) "https://play.nim-lang.org/#ix=3XQZ" => "https://play.nim-lang.org/#ix=3XR0" |
18:19:11 | FromDiscord | <Andreas> (edit) "https://play.nim-lang.org/#ix=3XR0" => "https://play.nim-lang.org/#ix=3XR1" |
18:19:16 | FromDiscord | <Yardanico> if your object is already a ref you don't need to prepend `ref` to its type again |
18:19:32 | FromDiscord | <Andreas> (edit) "https://play.nim-lang.org/#ix=3XR1" => "https://play.nim-lang.org/#ix=3XR3" |
18:20:11 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XR5 |
18:23:03 | FromDiscord | <Andreas> sent a code paste, see https://play.nim-lang.org/#ix=3XR6 |
18:23:32 | FromDiscord | <Yardanico> yes of course if you want a finalizer, but IMO it's better to use destructors as those are "native" to arc/orc while finalizers are "native" to refc but not arc/orc |
18:23:38 | FromDiscord | <Yardanico> and orc will become default in nim 2.0 |
18:23:59 | FromDiscord | <Yardanico> but again, you can use `new` with a ref object to assign a finalizer to it, yes |
18:24:20 | FromDiscord | <Yardanico> `new` doesn't create a `ref Type` if you pass it a `Type` that is already a ref |
18:26:25 | FromDiscord | <Yardanico> ah, seems like with the finalizer `new` is a bit of a different overload |
18:26:56 | FromDiscord | <Andreas> In reply to @Yardanico "ah, seems like with": ok, Rika came up with this one https://discord.com/channels/371759389889003530/371759389889003532/975378666668294174 |
18:27:20 | FromDiscord | <Yardanico> that makes `t` a `ref ref object` though |
18:27:27 | FromDiscord | <Andreas> (edit) "https://discord.com/channels/371759389889003530/371759389889003532/975378666668294174" => "https://discord.com/channels/371759389889003530/371759389889003532/975378666668294174↵which blows-up as soon as i try to set the .kind of t" |
18:28:17 | FromDiscord | <Andreas> In reply to @Yardanico "that makes `t` a": ok, so i better try a destructor |
18:28:27 | FromDiscord | <Yardanico> you can still do it like this: |
18:29:29 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XR9 |
18:29:55 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XRb |
18:31:54 | PMunch | Wee, nice I've got i2c working on the Digispark with Ratel now :) |
18:33:35 | FromDiscord | <Yardanico> @Andreas one thing to note is that destructors are more "low-level" than finalizers |
18:34:11 | FromDiscord | <Yardanico> if you define a custom destructor for a type, then you must manually call `=destroy` for all of the object's fields that are managed by the GC while finalizers do that automatically |
18:34:15 | om3ga | Hi! How to find element count in SharedList? |
18:36:38 | FromDiscord | <Rika> In reply to @Andreas "ok, Rika came up": that wasnt the one i made |
18:36:49 | FromDiscord | <Rika> https://discord.com/channels/371759389889003530/371759389889003532/975392559784423504 |
18:37:40 | FromDiscord | <Andreas> In reply to @Rika "https://discord.com/channels/371759389889003530/371": sry, mea culpa |
18:39:38 | FromDiscord | <Phil> I feel like I'm doing something I shouldn't somewhere. I somehow manage to generate `renameHook`-procs through a template (I can even import them into other modules and it compiles, they exist!), yet after the program compiles they aren't being used by jsony.↵↵The `newHook`-procs, generated by the very same template-call work though.↵Codesample incoming |
18:42:53 | PMunch | Wait, why isn't this in 1.6.6? https://github.com/nim-lang/Nim/pull/19545 |
18:43:17 | FromDiscord | <Yardanico> In reply to @PMunch "Wait, why isn't this": because it wasn't marked as backported? :) |
18:43:38 | PMunch | So it won't be added until 1.8? |
18:43:47 | FromDiscord | <Yardanico> maybe it'll get added to 1.6.8 ? |
18:44:05 | FromDiscord | <Yardanico> but yeah, not to 1.6.6 |
18:44:13 | PMunch | That doesn't make sense it was merged back in February, so why wouldn't it be in 1.6.6? |
18:44:40 | FromDiscord | <Yardanico> In reply to @PMunch "That doesn't make sense": because 1.6 branch isn't devel |
18:45:06 | FromDiscord | <Yardanico> 1.6 branch was made in october 2021 |
18:45:29 | PMunch | Yeah, but why would it then be added to 1.6.8? |
18:45:43 | FromDiscord | <Yardanico> because you can ping miran and ask him to backport it, that's what i meant |
18:45:45 | FromDiscord | <Andreas> sent a code paste, see https://play.nim-lang.org/#ix=3XRd |
18:45:55 | PMunch | Oh :P |
18:46:02 | FromDiscord | <Andreas> (edit) "https://play.nim-lang.org/#ix=3XRd" => "https://play.nim-lang.org/#ix=3XRe" |
18:46:09 | FromDiscord | <Phil> sent a code paste, see https://play.nim-lang.org/#ix=3XRf |
18:46:20 | FromDiscord | <Phil> (edit) "https://play.nim-lang.org/#ix=3XRf" => "https://play.nim-lang.org/#ix=3XRg" |
18:46:30 | FromDiscord | <Phil> Honestly, this is a crapshot if anyone has any idea whatsoever, feel free to skip |
18:46:42 | * | Zectbumo joined #nim |
18:46:46 | FromDiscord | <Yardanico> so is createUpdateHandler defined in encounterDeserialization ? |
18:46:49 | FromDiscord | <Yardanico> .nim |
18:47:03 | FromDiscord | <Yardanico> or does it import encounterDeserialization ? |
18:47:16 | FromDiscord | <Phil> (edit) "https://play.nim-lang.org/#ix=3XRg" => "https://play.nim-lang.org/#ix=3XRh" |
18:49:48 | FromDiscord | <Phil> sent a code paste, see https://play.nim-lang.org/#ix=3XRi |
18:51:24 | FromDiscord | <Phil> `encounterRoutes nim` calls the convenience proc, which calls `createUpdateHandler` to create a handler proc.↵Since that proc is now in the context of `encounterRoutes` and `encounterRoutes.nim` imports `encounterDeserialization.nim` (which has the `renameHook` proc), I would expect the created handler proc to make use of the `renameHook` proc. |
18:51:36 | FromDiscord | <Phil> (edit) "`encounterRoutes nim` calls the convenience proc, which calls `createUpdateHandler` to create a handler proc.↵Since that ... proc" added "handler" |
18:52:05 | FromDiscord | <Yardanico> what happens if you add `import encounterDeserialization` to `createHandlerProcs.nim` ? does anything change? |
18:52:21 | FromDiscord | <Yardanico> just to try |
18:52:45 | FromDiscord | <Phil> Yeh, am currently compiling it |
18:53:34 | FromDiscord | <Phil> I'll do `from encounter/encounterDeserialization import renameHook` because the other procs in that template that get generated would cause an `ambiguous call` error. |
18:54:24 | FromDiscord | <Phil> Still doesn't make use of `renameHook` ↵(I can see that because I fire an HTTP request to that endpoint and the value of the `diaryentry` field is not correctly transferred to the `diaryentry_id` field on `Encounter` |
18:54:31 | FromDiscord | <Phil> (edit) "`Encounter`" => "`Encounter`)" |
18:54:40 | FromDiscord | <Phil> (edit) "Still doesn't make use of `renameHook` ↵(I can see that because I fire an HTTP request to that endpoint and the value of the `diaryentry` field ... is" added "in the json" |
18:57:02 | FromDiscord | <Phil> The worst part is, I can't reproduce this in a minimal code sample. I've done semi-similar setups in a playground-project of mine and there it works.↵But that one doesn't try to use jsony within a proc created by a generic proc |
18:57:45 | FromDiscord | <Yardanico> well you can at least try to call renameHook explicitly in createUpdateHandler (just to test, you can create an empty variable of that type) so that it fails at compile time if it doesn't see renameHook |
18:57:50 | FromDiscord | <Yardanico> that should make testing faster |
19:03:14 | FromDiscord | <Phil> wfasdfjkadsjfsö |
19:03:27 | FromDiscord | <root> how do i remove an item from a sequence? |
19:03:37 | FromDiscord | <Yardanico> In reply to @Isofruit "wfasdfjkadsjfsö": yes? |
19:03:54 | FromDiscord | <Andreas> In reply to @root "how do i remove": delete( seq[], idx..idx) |
19:03:54 | FromDiscord | <Yardanico> In reply to @root "how do i remove": `del` and `delete` |
19:04:03 | FromDiscord | <root> thank you! |
19:04:05 | FromDiscord | <Yardanico> `del` doesn't preserve the order, `delete` does |
19:04:13 | FromDiscord | <Yardanico> In reply to @Andreas "delete( seq[], idx..idx)": no need for `[]`, and no need for `..` here |
19:04:26 | FromDiscord | <root> how do i get the index of something in a seq? |
19:04:29 | FromDiscord | <Yardanico> `find` |
19:04:37 | FromDiscord | <Yardanico> just `seq.delete(idx)` or `seq.del(idx)` depending on if you want to preserve the order in the seq or not |
19:04:42 | FromDiscord | <Yardanico> to delete |
19:04:47 | FromDiscord | <Yardanico> delete preserves, del doesn't |
19:05:11 | FromDiscord | <Phil> sent a code paste, see https://play.nim-lang.org/#ix=3XRn |
19:05:33 | FromDiscord | <Yardanico> In reply to @Isofruit "So I plonked this": well it's not that surprising, because this way you use renameHook right in your proc |
19:05:41 | FromDiscord | <Yardanico> and it's not jsony that's trying to use it |
19:05:52 | FromDiscord | <Yardanico> as an alternative, try to remove this whole `when` and instead add `bind renameHook` to the start of that proc |
19:05:52 | FromDiscord | <Andreas> In reply to @Yardanico "no need for `[]`,": i did `delete( seq, idx:int )` and got a deprecation-warning, range will be accepted in future.. |
19:06:02 | FromDiscord | <Yardanico> In reply to @Andreas "i did `delete( seq,": ?? |
19:06:27 | FromDiscord | <Yardanico> ah you're talking about https://nim-lang.org/docs/sequtils.html#delete%2Cseq%5BT%5D%2CSlice%5Bint%5D |
19:06:35 | FromDiscord | <Yardanico> this is for removing whole parts of the seq, not one element |
19:06:50 | FromDiscord | <Yardanico> system itself defines `del` and `delete` for removing single seq entries already |
19:12:53 | FromDiscord | <Phil> sent a code paste, see https://play.nim-lang.org/#ix=3XRq |
19:12:54 | FromDiscord | <Phil> Still breaks though |
19:13:14 | FromDiscord | <Yardanico> nonon, bind outside of `result` |
19:13:17 | FromDiscord | <Yardanico> i meant in `createUpdateHandler` |
19:13:46 | FromDiscord | <Phil> Hmm alright, let's see |
19:13:47 | FromDiscord | <Yardanico> `bind` is not a runtime operation, it's for compile time |
19:13:58 | FromDiscord | <Yardanico> https://nim-lang.org/docs/manual.html#generics-bind-statement |
19:14:07 | * | xet7 quit (Remote host closed the connection) |
19:15:07 | * | xet7 joined #nim |
19:15:41 | FromDiscord | <Phil> sent a code paste, see https://play.nim-lang.org/#ix=3XRr |
19:17:17 | FromDiscord | <Yardanico> hmm, and what if you keep this `bind` but also add encounterDeserialization import to `createHandlerProcs.nim` ? |
19:17:56 | FromDiscord | <Phil> This is already with `from encounter/encounterDeserialization import renameHook` at the start of `createHandlerProcs.nim` |
19:18:34 | FromDiscord | <Yardanico> then i don't have any new ideas, sorry :( guessing without full source code is a bit hard, but it's fine if it's a private project |
19:18:42 | FromDiscord | <Yardanico> maybe you can make a post on the forum or open an issue in jsony |
19:19:09 | FromDiscord | <Phil> Oh, I can gladly provide full source code, I've got a public github repo |
19:19:18 | FromDiscord | <Yardanico> oh why haven't you told that as the very first thing :D |
19:19:20 | FromDiscord | <Phil> Just that that source code would spam the entire channel for several screens worth just for this issue |
19:19:32 | FromDiscord | <Yardanico> yeah that's fine, just post the link |
19:19:47 | FromDiscord | <Yardanico> it's much easier to "try" the code itself than to guess from parts of it |
19:20:12 | FromDiscord | <Yardanico> kind of like watching someone else play the game vs playing the game yourself |
19:22:04 | FromDiscord | <Yardanico> @PMunch and yeah, in general PRs don't get backported to 1.6 at all so that's why your PR wasn't backported |
19:22:24 | FromDiscord | <Yardanico> they only get backported if the author (or someone else) explicitly asked for it either in PR name/commit message or in github commentrs |
19:22:26 | FromDiscord | <Yardanico> (edit) "commentrs" => "comments" |
19:23:49 | PMunch | Yardanico, yeah I keep forgetting this :P |
19:25:08 | FromDiscord | <Phil> sent a long message, see http://ix.io/3XRu |
19:25:48 | FromDiscord | <Phil> (edit) "http://ix.io/3XRu" => "http://ix.io/3XRv" |
19:32:34 | FromDiscord | <Andreas> In reply to @Yardanico "<@754284517316886598> one thing to": hmm, so low they never fire on generics ? Given my signature for `Node[K,V]` = `=destroy[Node](n: var Node) = echo "node died"` never fires ? |
19:35:34 | FromDiscord | <huantian> Shouldn’t it be =destroy[K, V](n: var Node[K, V]) |
19:35:38 | FromDiscord | <Yardanico> yeah |
19:35:58 | FromDiscord | <Yardanico> In reply to @Isofruit "In that case, small": i've hit some constructor macro bug, but I'll come to your bug after that :) |
19:39:55 | FromDiscord | <Andreas> In reply to @huantian "Shouldn’t it be =destroy[K,": computer says no ` identifier expected, but got ','` |
19:40:26 | FromDiscord | <Yardanico> In reply to @Andreas "computer says no `": are you sure you have it this exact way? |
19:40:34 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XRy |
19:40:53 | FromDiscord | <Yardanico> huantian just omitted ` for =destroy |
19:41:26 | FromDiscord | <Andreas> In reply to @Yardanico "are you sure you": yes |
19:45:06 | FromDiscord | <Phil> In reply to @Yardanico "i've hit some constructor": Wait, you have? |
19:45:11 | FromDiscord | <Phil> Dang |
19:45:17 | FromDiscord | <Yardanico> i guess it wasn't checked to work on devel |
19:45:47 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XRz |
19:46:06 | FromDiscord | <Yardanico> it fails at the assertion in micros/utils.nim `isa(n, ObjectDef)` |
19:46:12 | FromDiscord | <Phil> Ohhh constructor bug as in, bug within the constructor package... unrelated from my own? |
19:46:21 | FromDiscord | <Phil> (edit) "own?" => "own project?" |
19:46:41 | FromDiscord | <Yardanico> because apparently micros walks up the inheritance chain but gets Model as nnkIdent |
19:47:07 | FromDiscord | <Yardanico> constructor, not micros |
19:47:47 | FromDiscord | <Yardanico> [Elegantbeef](https://matrix.to/#/@elegantbeef:matrix.org)\: when you come online \:)↵(@Yardanico) |
19:48:22 | FromDiscord | <Yardanico> In reply to @Isofruit "Ohhh constructor bug as": yeah |
19:50:10 | * | droidrage quit (Quit: Gateway shutdown) |
19:50:10 | * | qwestion quit (Quit: Gateway shutdown) |
19:51:11 | * | xet7 quit (Remote host closed the connection) |
19:53:24 | FromDiscord | <Elegantbeef> Untyped AST causes the issue↵(@Yardanico) |
19:53:31 | FromDiscord | <Elegantbeef> I apparently dumbly used micros for this but forgot the AST is untyped so it cannot walk up the tree |
19:53:37 | FromDiscord | <Yardanico> heh |
19:53:48 | FromDiscord | <Yardanico> but how it works for @Phil 🤔 |
19:53:54 | FromDiscord | <Yardanico> (edit) "but how ... itwork" added "does" | "works" => "work" |
19:54:06 | FromDiscord | <Elegantbeef> Older constructor version? |
19:54:16 | FromDiscord | <Yardanico> hmm, I used nimble just as him |
19:54:16 | FromDiscord | <Phil> Have I transcended into the spaces of "It works and nobody knows why?" |
19:54:23 | FromDiscord | <Yardanico> requires "constructor >= 1.0.3" |
19:54:27 | FromDiscord | <Phil> Let me check my downloaded constructor version |
19:55:05 | FromDiscord | <Yardanico> ah constructor doesn't have tags |
19:55:07 | FromDiscord | <Phil> I've got constructor 1.0.3 and only that version |
19:55:30 | FromDiscord | <Yardanico> constructor has been at 1.0.3 for 4 months |
19:55:39 | FromDiscord | <Elegantbeef> Ah forgot to bump it for the last version |
19:55:53 | FromDiscord | <Elegantbeef> Though to be fair i didnt expect any API changes |
19:55:59 | FromDiscord | <Yardanico> guess commit 12ffdb55baabbd33f33aec490659d74ae8293232 of constructor will work for me for now |
19:56:28 | FromDiscord | <Yardanico> yeah that compiles |
19:56:48 | FromDiscord | <Elegantbeef> I assume the error appears in the fields iterator |
19:56:50 | FromDiscord | <Yardanico> btw @Phil you forgot to put miniz into nimble requirements :) |
19:57:19 | FromDiscord | <Phil> In reply to @Yardanico "btw <@180601887916163073> you forgot": Ahhh right, the compression of the outgoing HTTP response is something I only threw in relatively recently |
19:57:24 | FromDiscord | <Yardanico> and is there a reason it's used instead of zippy ? zippy seems to support deflate as well |
19:58:40 | FromDiscord | <Phil> I have both, and miniz was just the first one I used.↵I think it compressed on average like 2-3 % more in terms of size, but that's testing by hand for like 3 endpoints or sth |
19:59:08 | FromDiscord | <Phil> Overall they were very close to one another in both speed and amount of compression, so I just left it at miniz |
20:00:05 | FromDiscord | <Phil> Is there a maintenance reason to prefer one over the other? |
20:00:36 | * | ehmry quit (Ping timeout: 240 seconds) |
20:01:13 | FromDiscord | <Yardanico> less dependencies, miniz is effectively abandoned, and I can't install it for some reason :) |
20:01:28 | FromDiscord | <Yardanico> https://media.discordapp.net/attachments/371759389889003532/975488100249784340/unknown.png |
20:01:32 | FromDiscord | <Elegantbeef> Clearly just use supersnappy 😄 |
20:02:09 | FromDiscord | <Yardanico> In reply to @Elegantbeef "Clearly just use supersnappy": http doesn't have snappy as a support compression method |
20:02:36 | FromDiscord | <Yardanico> (edit) "support" => "supported" |
20:03:12 | FromDiscord | <Phil> I'll throw a commit up swapping to zippy and add the necessary readme text |
20:04:39 | FromDiscord | <Yardanico> also would be good if the repo had an examplke settings.json already for prologue :) |
20:04:53 | FromDiscord | <Yardanico> but I think now i'm close to running the project |
20:05:09 | FromDiscord | <Yardanico> "Error: unhandled exception: TINYPOOL: Tried to use uninitialized database connection pool. Did you forget to call 'initConnectionPool' on startup? [PoolDefect]" maybe not |
20:06:11 | FromDiscord | <Yardanico> "let databasePath: string = settings.getOrDefault("databasePath").getStr()" ah |
20:06:40 | * | ehmry joined #nim |
20:06:59 | FromDiscord | <Phil> I'm not that faaaaaast 😄 |
20:08:10 | PMunch | Hmm, so I'd really want to get VUSB wrapped on the Attiny85.. That way I can use serial over USB |
20:08:39 | PMunch | And since Ratel programs are so tiny the overhead really doesn't matter much :P |
20:08:47 | FromDiscord | <Phil> Okay, just pushed an example settings file |
20:09:33 | FromDiscord | <Yardanico> yeah it's fine I figured the settings by now :) |
20:10:03 | FromDiscord | <Phil> regarding sqlite, since I don't particularly fancy throwing a public version of my db sqlite up, I'll send you one via DMs |
20:10:46 | FromDiscord | <Yardanico> well i can do fine with the dev version, I just need a way to trigger your bug |
20:11:35 | FromDiscord | <Phil> The main issue really is that I don't have a dev version 😄 ↵The project is tiny enough that it's nothing major anyway, the target userbase is in the lower double digits and I'll never do any sort of payment stuff on this |
20:11:39 | * | wallabra quit (Ping timeout: 260 seconds) |
20:15:17 | * | PMunch quit (Quit: leaving) |
20:37:17 | FromDiscord | <treeform> In reply to @Alea "ah shit that's it,": I think it's an issue with nim's constant type stuff, it does not go far enough and is too eager to turn into float64 |
20:38:54 | * | kenran quit (Quit: WeeChat info:version) |
20:51:05 | * | wallabra joined #nim |
21:25:13 | * | jmd_ quit (Ping timeout: 248 seconds) |
21:44:36 | * | tk quit (Ping timeout: 252 seconds) |
21:44:53 | * | tk joined #nim |
22:10:16 | * | def- quit (Quit: -) |
22:31:34 | * | noeontheend joined #nim |
22:36:56 | * | noeontheend quit (Quit: noeontheend) |
22:48:39 | * | def- joined #nim |
22:54:37 | * | noeontheend joined #nim |
22:54:42 | FromDiscord | <Zectbumo> I just now noticed that the documentation separates parameters with semi-colon ;↵why is that? why not coma , like the declaration is? |
22:55:03 | FromDiscord | <Elegantbeef> Semicolon is more explicit |
22:55:50 | FromDiscord | <Elegantbeef> Explictly shows where typing of a group of variables end |
22:56:04 | FromDiscord | <Elegantbeef> parameters\ |
22:56:38 | FromDiscord | <Zectbumo> oh is semi-colon allowed in the language? so this is not out of the ordinary |
22:56:44 | FromDiscord | <Phil> Which is an argument. I disagree with that assessment and personally stick with the default as outlined by most other languages I know, but it's a point one may agree with |
22:56:47 | FromDiscord | <Elegantbeef> Yes |
22:57:16 | FromDiscord | <Elegantbeef> `proc doThing(a, b: string, c: int)` and `proc doThing(a, b: string; c: int)` are both valid |
22:57:30 | FromDiscord | <Elegantbeef> The latter is more explicit in where the declaration of types end |
22:57:52 | FromDiscord | <Elegantbeef> Most other languages dont do group type declarations so moot point↵(@Phil) |
22:57:52 | FromDiscord | <Zectbumo> ah very cool. good to know. and even though the source code isn't like that the manual makes it explicit |
22:58:46 | FromDiscord | <Elegantbeef> sent a code paste, see https://play.nim-lang.org/#ix=3XSh |
22:58:59 | FromDiscord | <Zectbumo> I do like that type declaration shortcut |
22:59:17 | FromDiscord | <Generic> the semicolon also has another important function for default typed parameters |
22:59:25 | FromDiscord | <Generic> you see this most often with generics: |
22:59:57 | FromDiscord | <Elegantbeef> Well the semicolon ends the typing of generic parameters `[T; Y: string or int]` is not equivlent to `[T, Y: string or int]` |
23:00:16 | FromDiscord | <Zectbumo> oh |
23:00:17 | FromDiscord | <Generic> yeah exactly |
23:00:33 | FromDiscord | <Elegantbeef> The former case the generic is anything |
23:00:37 | FromDiscord | <Elegantbeef> The latter case it's `string or int` |
23:00:44 | FromDiscord | <Elegantbeef> T that is |
23:00:47 | FromDiscord | <Zectbumo> I was wondering about that case, not that I needed it but I saw that it would come one day |
23:01:12 | FromDiscord | <Yardanico> semicolons are also needed with `using` |
23:01:20 | FromDiscord | <Elegantbeef> I honestly cant find another language that does group parameter typing |
23:01:29 | FromDiscord | <Elegantbeef> Good thing no one uses using |
23:01:34 | FromDiscord | <Generic> I use it |
23:01:35 | FromDiscord | <Elegantbeef> He repeats to himself |
23:02:06 | FromDiscord | <Generic> https://github.com/RSDuck/hocuspocube/blob/master/hocuspocube/gekko/interpreter/ppcinterpreter_int.nim |
23:02:06 | FromDiscord | <Yardanico> In reply to @Yardanico "semicolons are also needed": for those who don't know - https://nim-lang.org/docs/manual.html#statements-and-expressions-using-statement |
23:02:33 | FromDiscord | <Generic> I dare you to repeat `state: var PpcState` so many times |
23:02:39 | FromDiscord | <Elegantbeef> I wouldnt |
23:02:48 | FromDiscord | <Elegantbeef> I'd do `type MutState = var PpcState` |
23:02:59 | FromDiscord | <Elegantbeef> Checkmate atheists |
23:03:06 | FromDiscord | <Generic> that's possible? |
23:03:22 | FromDiscord | <Generic> though even then you'd need to explictly give that type every time |
23:03:39 | FromDiscord | <Elegantbeef> Yes it is |
23:03:45 | FromDiscord | <Elegantbeef> sent a code paste, see https://play.nim-lang.org/#ix=3XSl |
23:05:43 | FromDiscord | <Zectbumo> if you had a ton of procs I can see using being very useful. though, if that's the case then the reader would have to scroll way up to see what these parameters are typed. so maybe copy and paste / search and replace is everyone's friend |
23:06:22 | FromDiscord | <Elegantbeef> I just dont like using, it's an odd feature imo, so i just dont use it and pretend it doesnt exist |
23:06:33 | FromDiscord | <Generic> you do you, I'm glad it exists |
23:07:19 | FromDiscord | <Zectbumo> there is something here for everyone, and that's something I like about nim. and, usually if you don't like it there are answers to that too to change it |
23:08:32 | FromDiscord | <Zectbumo> now we just need a "delete keyword" feature for beef |
23:08:49 | FromDiscord | <Yardanico> delete what? |
23:08:53 | FromDiscord | <Zectbumo> using |
23:09:15 | FromDiscord | <Zectbumo> https://discord.com/channels/371759389889003530/371759389889003532/975534637059293254 |
23:09:38 | FromDiscord | <Elegantbeef> I never collide with it so it's hardly a needed feature |
23:09:53 | FromDiscord | <Generic> that's really one of the few things I really don't like about Nim |
23:09:57 | FromDiscord | <Generic> it's such a keyword hog |
23:10:10 | FromDiscord | <Generic> type, end, block, addr |
23:10:24 | FromDiscord | <Zectbumo> answer for that too ↵let `using` = "be your friend" |
23:10:34 | FromDiscord | <Zectbumo> (edit) "`using`" => "\`using\`" |
23:10:46 | FromDiscord | <Generic> I know this works, but it's ugly |
23:10:56 | FromDiscord | <Elegantbeef> Eh nim doesnt have that many keywords |
23:11:11 | FromDiscord | <Generic> but they're all things I want to name my variables |
23:11:12 | FromDiscord | <Elegantbeef> the only one i've tripped over is bind |
23:11:16 | FromDiscord | <Generic> oh yeah bind |
23:11:52 | FromDiscord | <Zectbumo> I tripped over "method" the other day |
23:12:14 | FromDiscord | <Elegantbeef> image.png https://media.discordapp.net/attachments/371759389889003532/975536110006579270/image.png |
23:12:17 | FromDiscord | <Elegantbeef> It's not too bad though |
23:13:09 | FromDiscord | <Generic> what's end even reserved for? |
23:13:12 | FromDiscord | <Generic> secret pascal mode? |
23:13:35 | FromDiscord | <Elegantbeef> Better to reserve a keyword and not need it then need it and not reserve it |
23:14:23 | FromDiscord | <Generic> I "wrote" (translated fits better) an interval tree and I had to come up with a better name for end |
23:14:25 | FromDiscord | <Yardanico> In reply to @Generic "what's end even reserved": at some point a endX syntax skin was planned |
23:14:30 | FromDiscord | <Yardanico> because braces skin was there already |
23:14:43 | FromDiscord | <Generic> oh I didn't knew syntax skins were ever implemented |
23:14:59 | FromDiscord | <Elegantbeef> Used to have {} syntax and whitespace at the same time 😄 |
23:17:09 | FromDiscord | <Zectbumo> I haven't been using nim long enough, but I can see myself with a desktop stickynote holding my basic imports: stdtabs, strformat, sequtils, ... what do you guys do? copy n paste a standard header line for all new .nim files? |
23:17:28 | FromDiscord | <Yardanico> i just remember quite a lot of the stdlib |
23:17:28 | FromDiscord | <Generic> I'm import what I need |
23:17:31 | FromDiscord | <Yardanico> so i import things what I need |
23:17:32 | FromDiscord | <Elegantbeef> You can make a `config.nims` that has `--import` statements |
23:17:50 | FromDiscord | <Elegantbeef> Yea i just import what i need |
23:18:02 | FromDiscord | <Generic> (if you want to pollute the namespace even more, not that that's very bad in Nim) |
23:18:32 | FromDiscord | <Elegantbeef> Especially with the overloadable(overridable?) enums it's not an issue imo |
23:19:15 | FromDiscord | <Generic> I always feel a bit bad for nimsuggest |
23:19:41 | FromDiscord | <Generic> though my project recently reached it's breaking point, so it's not an issue anymore |
23:48:51 | FromDiscord | <Zectbumo> what is a `none(int)` ?↵https://nim-lang.org/docs/cookies.html#setCookie%2Cstring%2Cstring%2Cstring%2Cstring%2Cstring |
23:49:08 | FromDiscord | <Yardanico> std/options |
23:49:12 | FromDiscord | <Yardanico> https://nim-lang.org/docs/options.html |
23:49:22 | FromDiscord | <Generic> https://nim-lang.org/docs/options.html#none%2Ctypedesc |
23:54:56 | FromDiscord | <Zectbumo> interesting. it avoids the nil issue, but the docs don't say what the nil issue is (as it says sometimes it's a "bad idea") and I can't find any docs on it in the tutorials and manual. |
23:55:47 | FromDiscord | <Yardanico> In reply to @Zectbumo "interesting. it avoids the": std/options in this case is used for cookies so you can denote the absence of a value |
23:56:12 | FromDiscord | <Yardanico> because maxAge is an optional cookie parameter |
23:56:21 | FromDiscord | <Yardanico> and it can also be zero or negative |
23:56:21 | FromDiscord | <Zectbumo> I got that part, but what are they talking about in the std/options docs saying "nil not always available, or not a good solution" |
23:56:36 | FromDiscord | <huantian> Nil is only an option for reference types |
23:56:38 | FromDiscord | <Elegantbeef> Options force you to unpack nilable types |
23:56:44 | FromDiscord | <Yardanico> the nil idea is to use `nil` as the absence of value for ref types |
23:56:52 | FromDiscord | <huantian> and the problem is nil is that you don't know, at compile time, if something can be nil or not |
23:56:59 | FromDiscord | <Elegantbeef> So you cannot accidently use nil`var a: ref int; echo a[]` |
23:57:16 | FromDiscord | <Elegantbeef> you do `var a: Option[ref int]; if a.isSome: echo a.get()[]` |
23:57:41 | FromDiscord | <Elegantbeef> Some people view that as the wrong wrapping of a nilable type |
23:57:43 | FromDiscord | <Elegantbeef> YMMV |
23:57:54 | FromDiscord | <Zectbumo> I see |
23:58:12 | FromDiscord | <Zectbumo> I would copy and paste that into the tutorial, beef |
23:58:34 | FromDiscord | <Yardanico> @beef |
23:58:38 | FromDiscord | <Elegantbeef> PRs welcome 😄 |
23:58:44 | FromDiscord | <Elegantbeef> Lol yard |