Forsp is fascinating language billed as a combination of Lisp and Forth. It’s stack based, but features easy idiomatic access to a local environment. This gives you the simplicity of Forth, but offers an “escape hatch” out of stack hell. Code that would require complicated stack/value shuffling in Forth can instead name the values and manipulate them in a way more natural to Lisp…
I use Gitlab to host a lot of my repos and I have one particular repo that runs CI a lot. It’s more convenient when it runs fast and it’s a lot cheaper on build minutes. It used to take nearly 4 minutes to run. Now it takes just 40 seconds. Why did it take so long in the first place, and how did I make it so much faster?
Heterosexuality and homosexuality have commonly understood definitions in western society. For reasons that will become clear, let’s refer to this as Strong Heterosexuality and Strong Homosexuality. For historical reasons, Strong Heterosexuality refers to a relationship consisting of exactly one man and one woman. Some proponents of Strong Heterosexuality include other descriptors like…
Emacs and Org posts are a dime a dozen on the internet, and they’re usually extremely specific, going into precise detail on how the author uses every tool in Org’s arsenal. I usually find these blog posts overwhelming and not particularly useful. Maybe I’ll pick up some tricks and integrate them into my own setup, but usually my eyes glaze over and I leave none the wiser. So…
I recently got a Raspberry Pi 4 model B, and I wanted to do the usual “deploy container orchestrator” thing, but I didn’t really want to do a full Kubernetes cluster because that seemed like overkill for such a small computer. I’d lose a lot of capacity to Kubernetes services even if I used a small distro like k3s. For the lower overhead and easier setup, I decided to go…
Clojure’s macro system is a little tricky to work with (at least for me), but it’s also quite powerful. Being able to rewrite the languages AST at compile time is really cool, and the fact that Clojure’s syntax is just the data structures that normal Clojure code operate on makes writing macros a breeze (at least compared to, say, Rust or Javascript). Clojure’s macro…
I have a modest proposal on repository organization. There are 2 primary archetypes, multiple repositories and the monorepo pattern. In multiple repositories, you have 1 project per repository, binaries requiring internal libraries, and use tools to ensure that you have all the necessary repositories downloaded and up to date (easy with most modern package managers). In a monorepo, all projects…
It’s been a long time since I last worked on ISL, mostly because I got distracted by other projects and languages: things like the flows project, or Clojure. Also, writing futures code in Rust is painful. Recently, async-await syntax got released on Rust nightly, which makes async code much easier to write. When I was last working on the project, I was working on a local variables feature.…
They aren’t super popular, but Clojure has a rich set of high level looping macros. You have for for list comprehensions, doseq for imperative looping over sequences, dotimes for an even simpler integer loop, while for raw predicate looping, and loop for any kind of arbitrary recursion-style looping you want to do. However, I’m not a huge fan of the exact syntax some of these macros…
In what is very likely an enormously bad idea, I have built a JVM classloader that can load dynamically load Java source files into memory. Why I’ve recently been going “Full Juxt”, using all of Juxt’s Clojure libraries, specifically juxt/aero for configuration, juxt/bidi for routing, juxt/yada for endpoint handling, weavejester/integrant for “building…
I mostly use this blog for theories, ideas, and think-pieces. But I figure I’ll return to the roots of blogging, and take the opportunity to explain a solution to a technical problem I encountered. The Problem I have a home lab server I built out old gaming PC. I haven’t done anything with its mediocre graphics card (so no exciting machine learning stuff). I’ve used it as a file…
God created this world. Now, he’s finished with it. I’m not entirely sure what medium best fits this story, but the idea started live as a story driven cRPG, so I’ll explain it like that first. Story The story begins in the holy city of Kalstar, rumored to the oldest city in the world, and home to the God’s Grand Temple. In the final chapter of God’s bible, He states…
When building consumer software, it’s a widely held belief that the software shouldn’t crash, shouldn’t hang (or ignore user input), and should generally remain “in control.” Users don’t like software that crashes and loses their progress, and they don’t react well to software that freezes: they tend to spam buttons, making the problem worse. This is just…
While attending college, for a variety of reasons too tedious to go into, I frequently dined at my college’s dining hall. I dined there on and off for all 4 years, and got to know its quirks: most usefully, what they could cook, and what they couldn’t but still attempted. However, I also learned some of the lore of the place, like the tale of The Triumvirate of Aberrations. I know…
Pipeline “operators” or “threading”1 constructs are interesting language constructs. They are an acknowledgement that functional code can be a little obtuse. They reorient (or rewrite) functional code so it looks more like a “dataflow”. Particularly of Lisps, but also of some other functional languages, execution moves from the inside of expressions to the…
Note in 2022: I’m in a very different state of mind compared to when I wrote this, and neither part represents my modern voice or style particularly well. I think it’s still a good story. In my last post , I covered my first attempt to implement TCP streaming in Flow , a data flow library for Elixir. My first attempts involved a bunch of failed Unix sockets, and an attempt to implement…
Note in 2022: I’m in a very different state of mind compared to when I wrote this, and neither part represents my modern voice or style particularly well. I think it’s still a good story. As part of a new and exciting project, I was faced with the task of ingesting a large amount of more or less homogeneous JSON data into a SQL database for an associate of mine to do some rudimentary…
It’s been a while since I posted progress on ISL, and that is mostly my fault. Most of this time was spent making maintenance, like documentation, but also trying to get the self hosted interpreter working and self hosting. That was a challenge, and also my fault.
I’m unemployed, so I’m constantly applying to jobs, and have posted my resume to a couple of job boards, attempting to prompt semi-cold calls from recruiters. And it’s worked, to an extent. I haven’t got a job, but I’ve gotten a couple emails from recruiters. I also got a rejection email. Not unusual, some companies decide to let me know that I’m no longer being…
Let’s talk about the VM internals. I’ve written a compiler for ISL, and implemented functions at the same time. This is not a mistake or an over-reach, rather a natural progression. To the VM, what is a function? The VM doesn’t have a strong concept of “functions”, or even of procedures. It has the Call and Return operations. These operations are the only way to…
Since last time, I did two things: switched from error_chain to failure , and refactored with the visitor pattern. They took about the same amount of time, and the refactor is much more interesting. I briefly touch on an issue I encountered with failure , but I’d rather discuss the refactor.
Let’s talk about environmental bindings. I’m taking the unusual (I think) approach of sharing environment bindings code between the VM and the interpreter. Unfortunately, I wrote the environment code at the same time as the VM, and fit the code a little too closely to the requirements of the VM, and didn’t think enough about what the interpreter would require. In the process of…
I recently started thinking about operators and math in programming languages. This is at least partly inspired by the programming language I’m making right now, but I’ll get to that later. It’s also inspired, in some sense, by the tutorials I was reading while trying to successfully parse my programming language. I didn’t find a tutorial specifically for what I was trying…
This update is all about parsing, and this ended up being really difficult. Not in a good way though. In my last post , I talked about using languages so difficult and alien that the difficulty clearly signified that there was something important you could learn from mastering them. I didn’t find this was the case during this phase of the project.
Have you ever been working on a project and felt stupid and scared? Not in an anxious way, and not in an imposter syndrome way, but in a visceral way, like “I don’t really know what I’m doing, and I’m not sure I can do this.” Some languages are so complex and different that, although I know they’re full feature and Turing complete languages, I don’t know…
My first impression of Go was, ironically, “kinda generic”. It’s an imperative language from Google inspired by Python (a little generic) and Java (reigning king of generic languages,) so some amount of “recognition” is due. Go wears its influences proudly on its sleeve, which is a little weird, because it’s not a particularly noteworthy heritage. The…
I took a lot of interesting courses in college, but I wanted to talk about a particular course that you might call a “hybrid course”. This particular course was outside my major: I was required to take non-CS courses to get my degree, but by senior year, I had also run out of CS courses to take; what is a man to do? Take a course on Ovid and Medieval Literature.
Part 1 Part 2 Last time, the conceptual challenges of a the stack VM convinced me it was the wrong approach. In a normal recursive lisp interpreter, code is data, and you have a single evaluator function over every value. Follow along here .
Part 1 Part 2 I recently had a new idea for a space programming game. The idea isn’t done, although the planning document is getting lengthy. Programming games need programming languages, and based on the game design, I had some pretty particular specifications for the language.
tldr: moba keystone dungeons Traditional cRPGs are, in general, united by a strong emphasis on character progression. By playing the game, and completing challenges, your character gains experience, sometimes represented by literal experience points, and becomes stronger, more capable, and better equipped for even more challenging encounters. This is frequently associated with numerical increases…
Previous Solutions Turntable is a collaborative DJ website that lets people play music to an online audience. Turntable, by default, doesn’t let you download the music you hear. If you hover over the track name in the UI, you can scrobble the track to Last.fm, find it in Spotify or Rdio, etc. Some people (myself included, but we’ll get to that later) wanted to download the files being…