1. 6

    Simplex noise is patented (because apparently you can patent math??). Completely uninteresting to me. I’m betting this is a not-insignificant reason for why Simplex noise didn’t take off.

    1. 5

      According to Wikipedia the patent will expire in about six months, so I’d say depending on how fast you plan to code, now’s a pretty safe time to get interested in it.

      1. 3

        Probably not, there are other implementations such as OpenSimplex.

        1. 5

          OpenSimplex is not just an implementation of Simplex noise, it is a new algorithm that produces visually different results, with different performance characteristics, especially in 3D where the simplex patent is in force. The original OpenSimplex algorithm is more expensive to compute in 3D than Simplex, with the benefit of smoother output. The output was further away from the desired range of [-1,1] than wanted, and the original algorithm was difficult to implement efficiently as a GPU shader. There were directional artifacts fixed in later designs. The original OpenSimplex was not fully competitive with Simplex.

          Today we can use OpenSimplex2 from the same author, with two variants: OpenSimplex2F is as fast as Simplex, and OpenSimplex2S is slower (same speed as OpenSimplex) but smoother. Better output range close to [-1,1], faster shader code. Plus the directional artifacts are fixed–the new stuff is lattice symmetric: “symmetry with the lattice (without letting neighboring points’ vectors line up with each other) can result in a more isotropic (non-axis-aligned) and more uniform appearance, especially when the noise is oriented in different ways.” https://github.com/KdotJPG/OpenSimplex2

      1. 2

        I’ve gotten back into generative art with Clojure and Quil/Processing, so I’m tinkering away at my current piece.

        I learned Clojure just so I could use Quil, so I plan to write up an article about my experiences as a Clojure beginner once I’m done with this piece.

        1. 1

          I remember this being so frustrating the first time I used Docker to run some self-hosted programs.

          1. 12

            TIL about starship for prompts. Looks good, I will give that a try.

            1. 3

              I used it when it was a regular zsh script. I got tired of having to re-configure it whenever updates broke my configuration as it changed or removed features I used. I’m not sure how stable it is now but I did enjoy it while it lasted.

              1. 2

                I’ve been using it for a while and haven’t had any of the problems that the other commenter seemed to have. My setup is pretty simple though.

                1. 3

                  There was one significant backwards-incompatible change that I can recall, but it was trivial to address. And for my part, I’d rather have my software evolving than never releasing a change in case it breaks someone somewhere.

                2. 1

                  I used starship previously and something happened to make it grind to a halt. I moved to romkatv/powerlevel10k and have had no such issues since. I once saw a discussion around a plug-in being implemented which was rejected as it took 10ms to run!

                  Edit: found the discussion, it was 11.4ms and it was reworked rather than rejected, but hopefully you get the point I was trying to make

                  1. 2

                    One aspect of my choice of Starship that doesn’t come through in this post is that I use the fish shell as my daily driver, but I use zsh and bash on remote hosts in various places. Having a consistent prompt on all three of those is a huge selling point, even if my prompt might take 50-70ms to render.

                    1. 2

                      Don’t worry, not trying to invalidate your choices or anything. I’m sure it was something I did otherwise the GitHub issues would be full of noise! Having a consistent prompt is a really solid pro for sure.

                      1. 1

                        I didn’t think you were :D

                        I just figured it might help to have a bit of clarity on the rationale. Arguably I should edit the post with that :)

                      2. 1

                        I’m curious why such a dichotomy? Are you required to use zsh/bash on the remote machines or is it a matter of convenience? I’m forced to use bash, but would gladly switch to zsh if I could install it…

                  1. 12

                    For anyone else ignorant of what “flakes” are in this context, here is an intro.

                    1. 7

                      Been working on my site almost every week for a while now https://www.unstitched.xyz The idea is to help men learn how to style clothes through experimentation by using capsule wardrobes (You can skip the sign in and see the capsules here - https://www.unstitched.xyz/home ). It’s still early days so I’m still quite embarrassed about it since it doesn’t have all the features I’d like it too.

                      I just keep going over it, refining the design or functionality and never really reaching out to people. Maybe it’s the fear of rejection, I don’t know… But I figured this week I should try reaching out to different bloggers and see what they make of it and if they thing it’s actually a useful tool. (If anyone has any tips or advice on how to get over the initial fear of trying to get people to use what you built even if you’re still embarrassed about it, please share :o )

                      1. 2

                        So a capsule is like a set of clothes for a specific use case? I like this!

                        I’ve been really minimalist for the past, well, however many years. So I can definitely see the appeal. If I want to “do thing” and there’s a recommended minimal (good) set of stuff to do “a thing”, I’d seriously look at it.

                        And really minimalist means 2 shirts, 2 pants, x underwear (hey, if you really want to know, I’m not shy about sharing), compact jacket, compact rainjacket, etc. All in all, under 8kg. Happy to share more if that would make a good capsule

                        1. 2

                          Yup! That’s pretty much the concept. Users can create capsule’s based on an occasion and can share it with the community (I’ve found most guys seem to shop on a “needs” basis, i.e. need clothes for work, or that date, etc so that was the inspiration). On a personal level, I had also found that if I saw an outfit online, and maybe I didn’t like the jacket I’d struggle to see how else I could wear it, or how to make it work with clothes I already owned. So a capsule gives you a kind of framework where you can swap clothes and make different combinations knowing each combination should work to varying degrees. But user’s can also “stitch” outfits (i.e. ‘like’) So you can see the most popular combos. I’ve created a wardrobe feature as well, with the future intention of allowing users to search for capsules or outfits that contain items they own. I’ve got a lot of features I want to add and it just seems that there are too few hours in a day along with full time work

                        2. 1

                          With respect to reaching out, allow yourself to be pleasantly surprised.

                          For what it’s worth, I really like the idea :)

                        1. 2

                          tldr: A scalar field assigns a single value (real or complex) to every set of coordinates (typically space and time) in the coordinate space. A vector field assigns a vector to each set of coordinates. A tensor field assigns a tensor (matrix with special transformation properties) to each set of coordinates.

                          1. 2

                            Something I see in common between Elixir (in this context) and Clojure (which I’ve been learning recently) is the emphasis on simplicity. I know very little about Elixir and I’ve only been learning Clojure for about a month, but I’ve grown to appreciate the burden that’s lifted when you can focus on one isolated procedure at a time while working on a larger program.

                            1. 4

                              Elixir borrowed a lot from Clojure - macros, build system (Mix team was using some insights from Leiningen authors), pipelines, etc.

                              On the other hand I see that Clojure borrowed a little from Erlang, so this is like closed loop of good design inspirations.

                            1. 5

                              I imagine this is a step towards modernizing the work environment for many people doing computational science. I know someone doing a master’s in CFD and he does about 50/50 FORTRAN and Python. He’s told me about some simulations that run on 800+ cores, which is kind of mind bending to think about.

                              1. 1

                                Another edition? I love rust, but this is starting to feel silly…

                                1. 15

                                  What? This is only the second edition. Did you think there was only going to be one edition?

                                  1. 14

                                    This one will also be coming out 3 years from the last one. Hardly seems too fast; this is the same pace for new versions as C++.

                                    1. 6

                                      C++ is a famously overcluttered language. I’d prefer not using it as a complexity benchmark for rust. However I also don’t object to the three year edition cycle.

                                      1. 1

                                        3 years is likely not even enough time for some large peojects to migrate to the previous edition. With a 3-year cycle there will be pressure for any large rust user to effectively constantly be updating. 10 years would be a better minimum.

                                        1. 8

                                          Edition migration is a job for one afternoon, not 10 years. It’s trivial. If your code compiled without warnings, it’s just a matter of prefixing a few things with r# or crate::. cargo fix does it automatically anyway.

                                          Don’t confuse edition-incompatible changes (which are few and small) with adopting new functionality added over these years. You don’t need to rewrite your code to use fancy new async/await just to enable a new compilation mode.

                                          Also it’s not an all-or-nothing switch for entire projects and their dependencies, like Python 2->3 was. Rust allows mixing editions, so you update one crate at a time.

                                      2. 1

                                        No, but I hoped for a more reasonable speed to introduce breaking changes. It’s only 3 years since the last one!

                                        1. 3

                                          From https://doc.rust-lang.org/edition-guide/editions/index.html:

                                          When a new edition becomes available in the compiler, crates must explicitly opt in to it to take full advantage. This opt in enables editions to contain incompatible changes, like adding a new keyword that might conflict with identifiers in code, or turning warnings into errors. A Rust compiler will support all editions that existed prior to the compiler’s release, and can link crates of any supported editions together.

                                          In other words, there are no breaking changes, there are changes one can opt in to enjoy the new shiny things, and the editions are promised to be supported and compatible “indefinitely”.

                                          1. 1

                                            enales editions to contain incompatible changes

                                            It’s right there in the quote :) Yes, a large project could stay on the previous edition, but there will be pressure to move, and more pressure as each new edition comes out and they are perceived as being “further and further behind”. This is the same thing that happens with other opt-in language version ecosystems (haksell, C, C++, probably others)

                                            1. 7

                                              The pressure to stay up to date with language idioms and latest dependencies is real, but it’s a separate thing from enabling an edition flag in Rust.

                                              Editions are different from C++ versions! In C++ new features aren’t added to old versions, e.g. C++98 is frozen in time and hasn’t changed since 1998. This is not the case in Rust! Every new feature in Rust is added to all past Rust editions, as long as it’s possible (i.e. it doesn’t require a keyword added later). For example, the new 2021 const generics feature that will be released this month is available in the Rust 2015 edition.

                                              Rust editions are closer to "use strict"; in JS. There’s one Rust with one feature set, one standard library, and there are different levels of warnings vs errors and minor syntax variations to keep old programs compile with no changes.

                                              Switching on Rust 2018 edition just boils down to tiny things like “I’m not using async or try keywords for my functions/variables”. You just rename variables if you did, and off you go!

                                    1. 3

                                      Imagine being the mathematician whose discovery gets sudden real world usage after decades. There must be no greater high.

                                      1. 5

                                        Either that or incredible fist shaking at all the years people ignored you :)

                                      1. 13

                                        I still don’t think this story is real. This is comparing third-hand information to hard denials from Apple, Amazon, FBI, NSA, DHS and ODNI. There should be millions of these devices in supply chains. Why can’t anyone produce a tear down or a report documenting exactly what was inserted, how it works and where it came from?

                                        In 2018 we all panicked, then every company cited in the story issued hard “we have examined the devices in our supply chain and found nothing” statements. Then another long piece is published that is still incredibly poorly sourced with zero evidence.

                                        1. 3

                                          I agree, without very clear evidence from third parties it’s hard to believe this. Even if the reports of the US Air Force briefing that guy are correct, the US government has a long history of using the mostly uncritical press as a propaganda machine through “leaks” and influence peddling.

                                        1. 3
                                          • Continuing to learn Clojure
                                          • Running a Valentine’s Day themed Honey Heist session for me and my single friends.
                                          1. 2

                                            speaking of additions to the language, any idea why a crate for a proprietary password manager is now required to build rust itself?

                                            https://github.com/rust-lang/rust/blob/master/Cargo.toml#L24

                                            1. 9

                                              That particular section of Cargo.toml is listing all of the workspace members, which just means that all of those projects share dependency resolution information, compilation profiles, etc.

                                              That particular project is part of cargo, and it looks like that’s just one particular provider for storing tokens securely. There are other crates in the same repository for macOS, Windows, and Gnome. I suspect the maintainers would be open to contributions that support other providers.

                                              1. 2

                                                fair enough, thank you for filling me in

                                                1. 1

                                                  1password is no more proprietary a password manager than macOS or Windows.

                                                  1. 1

                                                    You’re correct of course that macOS and Windows are both proprietary, but if you buy a Mac or Windows laptop, 1Password is not included in that purchase :)

                                                2. 4

                                                  These tools are described in the cargo-credential README.

                                                  The specific crate you mentioned contains this single file: main.rs

                                                  It seems to be a wrapper around 1password’s op command line tool, implementing the Credential trait for storing and retrieving passwords.

                                                1. 1

                                                  I wish the author did longer running benchmarks than just a few miliseconds. It’d be interesting to see if those numbers are significant with n=1000 and over a million. Some of these differences may be insignificant over a large data set; others more pronounced. If you graphed them by n size, you should also see if the O() changes at all (it shouldn’t).

                                                  1. 1

                                                    I don’t think that’s a valid complaint. There’s a clear trend across all the benchmarks he showed in the article.

                                                    1. 1

                                                      These are some of the benchmarks the CPython developers are using to track CPython performance, so I assume they’re decently meaningful: https://github.com/python/pyperformance

                                                      Also the “shared library makes things slow” and “-fno-semantic-interposition makes shared library less slow” is not my conclusions, it’s result of other people benchmarking.

                                                      I also did some initial benchmarking with pystone; same results.

                                                    1. 15

                                                      Having an independent Rust foundation removes one of the largest barriers I’ve had to using Rust in production. I had to worry that, should Mozilla go under, Rust would be left rudderless.

                                                      Now, the only major objection I have is that there is no specification of the language. This goes beyond just “no third party implementations” kinda thing, but rather that there are fairly important parts of the language that are unspecified. The exact rules of the borrow checker, for example, are not specified (the Rustonomicon even explicitly laments this fact).

                                                      That second point isn’t as big an objection, though. Lots of languages don’t have formal specifications and I still use them in production.

                                                      1. 6

                                                        I can imagine such a specification being quite difficult to arrive at, barring some intense formalization of properties that power Rust.

                                                        However, I can also imagine such a specification being highly desirable for the five megacorps that are already in support of the RSF. Thus, perhaps the future will bring a bright thing or two in that realm.

                                                        It’s very big, and it’s very broad, and there hasn’t been a lot of wrangling in that department. I can’t blame them for that, tbh. Formalization is pretty difficult to go about, especially dealing with a large team, especially when that team isn’t particularly academically bent or adept, and finally, because it’s not something that the average project needs. Very few people relative to the masses of developers are people with formal spec writing and verification experience. That’s a big ask without a big wallet to make it so.

                                                        1. 5

                                                          People have already been working on this for years, see RustBelt

                                                      1. 3

                                                        Very cool! I’m curious, what are the best “design patterns” for these types of programming language foundations? Who is doing this right? Are there non-profits where all corporate docs are on GitHub? Where all payments are done via crypto? Curious about the bleeding edge of running distributed non-profit organizations.

                                                        1. 5

                                                          The Python Software Foundation is a good one to look at.

                                                        1. 7

                                                          I think this is the biggest advancement in Rust so far. I’ve been concerned about laying a finger on Rust for a long time because I have a lot of concern about Mozilla and it’s ethics. After the Brendan Eich ordeal it was difficult to rationalize any kind of investment in a company that behaved that way.

                                                          Bringing Rust into the realm of the Software Foundation, I can say I’ll be following Rust with a renewed interest. Zig beat them to it, and I’d gladly consider a new project in Zig before I chose Rust, for obvious reasons, as I’m sure we’re all pretty sick of hearing about “what Rust can (kinda) do”, but all the same, these are some big names getting behind the project. That much can’t be ignored.

                                                          2021 is shaping up to be a fast-moving year in PLs and PLT research as well.

                                                          1. 15

                                                            as I’m sure we’re all pretty sick of hearing about “what Rust can (kinda) do”

                                                            At this point I hear more people saying this than I do people actually evangelizing Rust.

                                                            1. 23

                                                              Brendan Eich did something that made it hard to believe he’d be fair and welcoming in a global project that extremely heavily depends on public goodwill and participation of volunteers.

                                                              (And he continues to make controversial, and frankly dangerous and stupid, public statements today. He denies that face masks work during a global pandemic, and actively discourages people from listening to public health experts, for example.)

                                                              His job was to be the face of the company. People freely chose not to associate with a company who chose someone controversial as their face. Enough people made this free choice that it seemed wise to pick someone else.

                                                              I never understood why this was so terrible. What is the alternative? Force people to use products and services they don’t want to use? Forbid people from making purchasing decisions based on how they feel about employees at a company?

                                                              1. 12

                                                                Enough people made this free choice that it seemed wise to pick someone else.

                                                                I never understood why this was so terrible.

                                                                TBH I assumed the bad behavior referred to was that they kept a shitbag like Eich around as long as they did.

                                                                1. 6

                                                                  A diverse opinion being rejected in a group inherently portrays that group as exclusive in nature. Bubbling themselves in has alienated a lot of possibilities. Look at recent cuts Mozilla has to make, look at FF’s market share in the browser realm. I see W3 reporting FF as lower than 10% these days.

                                                                  I don’t know about his opinions on these things, I’m not really trying to open a discussion about Eich, I’m not his follower, I am just presenting the novel idea that booting people for their personal opinions leads to failure and echo chambers and whatever else.

                                                                  His JOB was co-founder. He CO-founded Mozilla. That’s different than being hired as CEO “here, go be the public figure, soak up those headline bullets and shut up on socials”.

                                                                  Anyhow, I’m not a Mozilla history expert. I don’t think it’ll be relevant in 20 years, afaict it’s already dead.

                                                                  Rust however, need not die, insofar as enough resources are dedicated to its longevity factor. Rust needs major reworking to be able to integrate new compiler core team, there’s major work needed to improve syntax issues, there’s HUGE work needed to do something about the compile times. I’ve seen users describe it as “not a better C, but a better C++” and I think that’s a decent designation for it for the time being. Still, without major pivoting and better resource and labor allocation, the project is in big trouble. I see people working on Rust who tweet 50-70+ a day. How productive can they really be???

                                                                  It’s whatever. I really like the idea of a software foundation. It’s definitely going to be helpful to have diverse minds in diverse fields bouncing ideas around. It’s great.

                                                                  1. 22

                                                                    May I refer you to the Paradox of tolerance? Groups that want to maximize diversity must exclude those who are against diversity.

                                                                    Eich gave public material support to Prop 8. He could have pretended he doesn’t support it, he could have “shut up on socials”, but he chose not to.

                                                                    1. 16

                                                                      I remember when he was debating this on Twitter. His response was that people not wanting to work with him because of his support of Prop 8 (which would make same-sex marriage illegal) was “fascism”.

                                                                      Of course, he said this to people who were freely choosing to not associate with him based on their own opinions and his public statements…while he himself was supporting expanding government power to limit the kinds of associations consenting adults could participate in.

                                                                      One of those is was way more “fascist” than the other.

                                                                    2. 14

                                                                      A diverse opinion

                                                                      This characterization is both insufficient and inaccurate.

                                                                      1. 12

                                                                        His JOB was co-founder. He CO-founded Mozilla. That’s different than being hired as CEO “here, go be the public figure, soak up those headline bullets and shut up on socials”.

                                                                        No one complained about him until they hired him to be the CEO. I didn’t even know his name before that and I bet a lot of other people are in the same boat. You seem really offended by something but you don’t seem to know what it is…

                                                                        1. 7

                                                                          Still, without major pivoting and better resource and labor allocation, the project is in big trouble

                                                                          You would know better than I would, but this is honestly the first time I’ve ever heard anything other than “Rust is the language of the future and there’s no need to learn anything else ever.” I’m being only slightly facetious.

                                                                          Seriously, though, from a mostly-outsider’s perspective, it seems like Rust is going nowhere but up and seems to be poised to take over the world. I suppose there’s a difference between Rust-the-language and Rust-the-project, but they’re pretty much identical to me.

                                                                          1. 6

                                                                            I see people working on Rust who tweet 50-70+ a day. How productive can they really be???

                                                                            This is patently ridiculous as an argument.

                                                                        2. 12

                                                                          Mozilla did not own or control Rust at any point. The Rust project started out managed by Graydon Hoare in 2006, and Mozilla began financially supporting it in 2009 (link to the history). Mozilla did own the trademarks for the Rust and Cargo names and logos, which were controlled and licensed in an open manner, and protected only to the degree necessary to avoid implied official status or endorsement by the Rust project (link to the policy). Mozilla also paid for the salaries of developers who worked on Servo, for some period one of the two largest Rust projects (the other being the Rust compiler itself), as well as the salaries of some folks who worked on the Rust compiler. However, Mozilla did not exercise or influence the direction of the Rust language, and from an early period a majority of Rust’s contributors, including members of the Core Team and other Rust Teams, did not work for Mozilla.

                                                                          1. 4

                                                                            what Rust can (kinda) do

                                                                            I’m curious what this bit refers to

                                                                            1. 1

                                                                              This could refer to many different parts of a immature ecosystem like GUI programming

                                                                          1. 11

                                                                            For the fun of it, two alternatives to shorten your solutions.

                                                                            The first uses juxt and is mostly point-free, but terse:

                                                                            (->> "aaaabbbcca"
                                                                                 (partition-by identity)
                                                                                 (map (juxt (comp str first) count))))
                                                                            

                                                                            The second one with for, a bit chattier but also more legible:

                                                                            (for [p (partition-by identity "aaaabbbcca" )]
                                                                              [(-> p first str) (count p)])
                                                                            

                                                                            Since you were mentioning suggestions in the article, this is one of the

                                                                            1. 6

                                                                              Here’s my point-free take on it using Dyalog APL

                                                                                    (((1∘+ +\) ⊢ ≠ ¯1∘⌽) (((⊃,≢) ⊢) ⌸) ⊢) 'aaaabbbcca'
                                                                              a 4
                                                                              b 3
                                                                              c 2
                                                                              a 1
                                                                              
                                                                              1. 4

                                                                                Nice! Here’s mine:

                                                                                       f←(⊃,≢)¨⊢⊆⍨1+(+\0,2≠/⊢)
                                                                                       ⊢x←f'aaaabbbcca'
                                                                                  a 4  b 3  c 2  a 1
                                                                                       ↑x ⍝new formatting, same great taste!
                                                                                 a 4
                                                                                 b 3
                                                                                 c 2
                                                                                 a 1
                                                                                

                                                                                And for bonus points, the decode:

                                                                                       g←∊(⌿⍨⌿¨)
                                                                                       g x
                                                                                 aaaabbbcca
                                                                                

                                                                                I really wish dyalog had capped forks—they would obviate the last set of parentheses in the encoder.

                                                                                1. 4

                                                                                  I love it! I wonder what differences in memory or performance would be in applying (⊃,≢) as you do to each partition after grouping them, vs during the grouping as I do with the key operation. I’d forgotten about the “n-wise reduce” variant you used, which is much nicer than my ancient rotation idiom.

                                                                                  It’s interesting how similar the Clojure and APL solutions for a problem like this can be. I mean (juxt first count) and (⊃,≢) are remarkably alike. It makes me wonder what Clojure would be like if it had function trains instead of threading macros.

                                                                                  1. 2

                                                                                    This has to be the most interesting discussion I’ve seen this week. Downside: now I’ll have to relearn APL enough to understand your solutions. :D

                                                                                    1. 1

                                                                                      memory or performance

                                                                                      IME performance is generally not super intuitive to reason about in APL, because of the interpreters’ ability to do pattern recognition.

                                                                                      It’s interesting how similar the Clojure and APL solutions for a problem like this can be. I mean (juxt first count) and (⊃,≢) are remarkably alike. It makes me wonder what Clojure would be like if it had function trains instead of threading macros.

                                                                                      This is a good read.

                                                                                    2. 1
                                                                                      (⊃,≢)¨⊢⊆⍨1+(+\0,2≠/⊢)
                                                                                      

                                                                                      duh; simpler: (⊃,≢)¨⊢⊆⍨(+\1,2≠/⊢)

                                                                                    3. 2

                                                                                      Having never seen this language before, it looks like someone has incorrectly rendered a bunch of UTF-8 characters lol

                                                                                    4. 3

                                                                                      That’s a nice use of juxt to make it point-free (what do you mean, mostly point-free?). My first intuition was pretty much the same with an anonymous function instead of juxt.

                                                                                      I believe getting used to threading macros make data manipulation tasks like this one much, much easier to approach. Both when writing and when reading.

                                                                                      I have a hard time believing that most candidates cannot solve the problem. Do they claim to know Clojure?

                                                                                      1. 3

                                                                                        It looks like the original tweet wasn’t about clojure?

                                                                                      2. 3

                                                                                        Unrelated, but I thought I’d comment anyhow since I know you’ll read it:

                                                                                        Your brainfuck interpreter changed the way I thought about everything. Long, long story short, more than ten years ago I began my journey learning Scheme through SICP, and over time I just lost the spark and sorta fell away from writing beautiful programs and wanted to just write clever programs. I was working on a little side project involving a genetic algorithm and brainfuck, and along the way, I thought “oh, what the hell, I may as well read a bf interpreter and then just try and write my own” and I stumbled across yours.

                                                                                        I won’t bore you, but let me just tell you that when I read that code, it became as clear as day to me how long it had been since I read something elegant and beautiful. Since then I’ve been getting deeper and deeper into Clojure, and that old part of my brain that sought after beautiful programs is starting to feel rejuvenated. I’d been reading Ruby classes and Python classes for SO long, it’s been really nice digging my brain out from all of that.

                                                                                        This may be a really weird comment to read, sorry. I just really had a ~*~moment~*~ after reading your code. It’s immaculate.

                                                                                        1. 3

                                                                                          This means a lot, thank you.

                                                                                        2. 3

                                                                                          Thanks. Both suggestions look good, the first one little bit more readable.

                                                                                          1. 3

                                                                                            Oh wow, juxt there makes it sweet. Nicely done!

                                                                                          1. 5

                                                                                            SICP brings wonders. The rest I don’t know.

                                                                                            SICP: https://github.com/sarabander/sicp

                                                                                            1. 6

                                                                                              SICP is vastly overrated.

                                                                                              1. 6

                                                                                                Ok, I’ll bite. Why do you say that?

                                                                                                1. 1

                                                                                                  I understand it doesn’t resonate with everybody, which is why I included it in the section of books good for specific interests.