In the article, Mitchel mentions how this doesn’t always work. In fact, as someone who’s worked in compiler development, I can say it’s a small miracle when it does work.
A few years ago, I was working on an interpreter implemented in elixir for a domain specific language. It was a pretty basic metacircular interpreter. It relied heavily on function signature dispatch. When I tried breaking up the massive “interpret” function across modules, performance tanked. I got it all back by using some macro shenanigans, but understandably the team did not like this.
Knowing what I know now, I would’ve tried to push for a threaded interpreter to get rid of the runtime overhead of dispatching altogether. I don’t know if they’ve changed the architecture of that module much since I left :-)
> "You can't complain about being require to take a 100-level history course because our job is to turn out renaissance scholars who can debate philosophy at cocktail parties before going to work doing something that has absolutely nothing to do with that."
> All the while, those additional credit hours cost students a shitload of money and debt and take focus away from their actual fields of study.
This is a straw-man. The purpose is not to turn people into renaissance scholars. It's to inculcate appreciation for what makes life worth living. An educated populace is also a requirement for a healthy democracy. Everyone ought to know some history at a minimum.
This is not great. The purpose of higher education is not to get you a job. That's certainly a nice side-effect and I hope that all my students will be able to support themselves through good employment. The university is there to educate you, not train you. It's to turn you into a better thinker, a better person, and someone more capable of living well.
Making art and humanities programs demonstrate some kind of pecuniary benefit is disgusting and myopic. My wife pursued English because she loves writing. She's earned about 0 dollars from that degree because she's home with our kids. And that's OK! Our lives are so much richer because of her degree—as well as the classes I took from the English department. So we should penalize the humanities because it merely makes people better thinkers and doesn't have as high of an ROI as an MBA? Yuck!
(EDIT: the article does mention that this bar is low—so not too bad—but the fact that this is a metric and criteria in the first place opens this up to abuse in the near future.)
I get that it's intended to cut down on ballooning tuition and fees, but *this is not the right way to do that.* (Actually, if we eliminated half the administration, I wonder how much we could cut costs…)
I'm in Emacs 99% of my day, and I don't think I've ever used the function keys inside Emacs.
All my volume/brightness/etc functions are handled on a separate layer. I've got function keys on another layer as well, but I don't ever use them.
If you use function keys a lot, then you could do something like putting the function keys on one layer all on the right hand like it's a num pad and then adding a key on the left hand to switch to that layer. You could add combo-taps on your main layer to trigger the function key (e.g. press `q` and `1` at the same time to hit `f1`, `w` and `2` at the same time to send `f2`, etc.), etc. etc.
QMK gives you a lot of options to do what you want. There's also 3 keys towards the center of the keyboard on each side that I rarely hit (in fact, they're used for some layer switching some times!) that you could easy bind to function keys directly.
Note that a key can do like 4 different things depending if you tap, hold, double tap, or tap and hold if you want to get really fancy.
Typing this on a Moonlander right now. Love it to pieces. The tenting kit is pricey but incredibly stable and, to me, is worth every penny. I've gotten used to the ortholinear so much so that I hate other layouts now.
I've looked at some other more minimal boards and, while they look nice, I actually make good use of pretty much all my keys and I would not like going down to a smaller layout.
In my mind, the most important pieces of a good keyboard are, in this order:
1. QMK/ZMK firmware so you can add stuff like mod-taps and whatnot
2. Split & tented to avoid bad wrist angles
3. Lots of buttons for your thumb to press: it's your strongest finger so you should put it to work
4. Ortholinear layout for more natural finger movement
ZSA (the maker of the Ergodox, Moonlander, and Voyager) is a great company—I've had incredibly positive experiences with their support team whenever I've needed help. One time I was having trouble using their online configuration tool (https://layout.new) and so I emailed support. I got an email back within the hour from a developer asking for more details. After I supplied this, it was just another hour until I heard back saying that they had found a bug and that the fix was live. So awesome!!
Matthew Flatt picked “shrubbery” because it’s tree-like but not fully expanded, so it tends to be more broad/flat than deep like a tree. Hence also the term “enforrestation” when you fully expanded it.
I think the Monty Python reference is just a happy coincidence.
I think my favorite thing is the `…` operator. Go check it out. It’s not like the splat operator in other languages, though it does give that feel initially. It’s much more general: it works with nested data structures and can take the place of a `map` operation.
The best part of `…` is that it is not a built-in thing—it’s just a macro! The magic is that Rhombus lets you define different macros depending on whether or not the macro identifier appears in binding context (left side of `=`), expression context, or some other contexts. IIRC you can even define your own contexts too.
Rhombus takes the best-in-class macro system of Racket and somehow finds a way to improve upon it. I say this after researching and comparing detailed metaprogramming features across a dozen different languages. Rhombus is a very neat little language.
Last thing: Rhombus’ main data type, the list, is implemented with an RRB tree. RRB trees support structural sharing, functional updates, and have O(log n) iterate, insert, delete, append, and arbitrary read operations. The constant factor on that is tiny: I think it’s like log_16 or log_32. They’re designed to be very cache friendly. Super cool data structure.
If you find yourself wanting to try out Emacs but are (understandably) turned off by some of its archaic defaults, I encourage you to check out my Emacs Bedrock [1] project. It is not a framework like Doom Emacs or Spacemacs. Instead, it's just a bunch of better defaults, plus some example configuration for some of the most popular packages. It's meant to just be a starting point, and not a framework to keep up-to-date in the long run.
Emacs has come a long way in terms of in-built features. The only problem is that, in the name of not breaking backwards-compatibility (or something like that), the archaic defaults have remained. Just a little bit of simple config (either from Bedrock or, heck, even an LLM) will get you very far.
I'm working on a new version of Bedrock for Emacs 31. If you're using the release candidate (which, because it's Emacs, is more stable than most other operating systems) then check out the `emacs31` branch.
I spoke to the couple (it’s like a single married couple + a bunch of scripts they’ve wrote) who handle the formatting for a bunch of the programming language-related conferences around the world (and others too maybe) and they are interested in Typst and are looking into it! (They’re also super nice folks.)
Codeberg: https://codeberg.org/ashton314
GitHub: https://github.com/ashton314
Blog: https://lambdaland.org