No, this post is not about a Burnout game. It’s about generative AI. Well, not strictly gen-AI, but Large Language Models. Well, not necessarily LLMs, but internet buzz around both of them. At first, I wanted to write a post on my thoughts about LLMs, constant deem of disclosure 1 , and how it affected me in the past year or so. After trying to write that post for like three times and being…
part one: persistent data structures part two: immutable.fnl optimizations part three: parsing part four: parsing (again) Other than that, the parsing is complete, and we can look at the compiler part of the ClojureFnl project. But that’s gonna be in the next post. Sike! Wasn’t my intention to fake out like this again, but while working on the compiler, I had an important realization…
Earlier this year I published a guide on how to implement slopes in AABB collision resolution using bump.lua . The resulting system worked, but was a bit hard to use in-game and had a few issues, so I wouldn’t consider it a viable solution. The main issue with the old approach was the use of the cross collision response. It allowed the object to move through the slope as if it wasn’t…
This year I decided to participate in the Spring Lisp Game Jam . It’s an annual event, where you have to make a game in any kind of lisp in a limited time, usually a week. I’ve been putting this away for several years, because every time the jam started I wasn’t ready to spend time on it, because of work or other duties I had at the time. This year, however, I decided to take a…
part one: persistent data structures part two: immutable.fnl optimizations part three: parsing part four: parsing (again) The two previous posts were not related to the compiler itself, but were kicked off by the start of the compiler development. I’d say this project was the reason that I made proper immutable data structures for Fennel and Lua. But now we’re finally going to talk…
part one: persistent data structures part two: immutable.fnl optimizations part three: parsing part four: parsing (again) So the next post will hopefully be about the compiler itself. Unless I get distracted again. Sike! While I did some work on the compiler, I’m not feeling ready to talk about it yet. I want the post about it to be, well, more in-depth, so for now, let’s go back to…
part one: persistent data structures part two: immutable.fnl optimizations part three: parsing part four: parsing (again) Somewhere in 2019 I started a project that aimed to bring some of Clojure features to Lua runtime - fennel-cljlib . It was a library for Fennel that implemented a basic subset of clojure.core namespace functions and macros. My goal was simple - I enjoy working with Clojure, but…
Recently (again, bored on a vacation ), I started working on a game I’ve planned for a long time. I wasn’t satisfied with my existing implementations of a player controller 1 , so I started working on a new one. After a bit of fiddling around, I came to something I’m satisfied with, for now, at least, but while working on it, I wanted to add something I haven’t done in any…
This sure was a long year. Work stuff January began with bad news - the product I worked on was about to be closed. We weren’t sure how things would go, and a lot of people started to worry about their job security. And rightfully so, a few months later, the decision was made to reduce staff, and our team was on the list. A lot of people got laid off, only a few remain to support the project…
A sequel to Linux Music Players . I’ve been using Linux for the past 15 years and managed to solve almost all my problems with it during that time. But I had to switch to a Mac due to reasons related both to my work and my hobbies, so now I have to solve the same kind of problems, but in macOS. I like music. No, I love music. Maybe I’m not the biggest music listener in the world, and…
Recently, I bought my first-ever MacBook. I’ve spent some time with it, and I gotta say - despite all that hot garbage that is thrown at GNOME for being an OSX clone, GNOME does the job better than I’ve expected, and certainly better than Apple. In some areas, that is. Good old days of Linux A bit of a backstory. I’ve been using GNUplusSlashLinux for more than fifteen years. Most…
I’ve been programming in Clojure for the last five years. I don’t write much about it here, largely because I use Clojure at work and rarely for hobby projects, so I don’t have much to share. Even today, the post will be more about Clojure tooling, rather than Clojure itself. Today, most developers expect the language they work with to have a certain amount of specific tools,…
Some time ago, I was working on an HTTP library for Fennel. As a proof of concept, I added a module that implements a simple web server and wanted to experiment with it. The server can serve files from a directory using this simple handler: ( fn handler [{ : method : path & as request }] ( case method :GET ( let [ file ( io.open ( path :gsub '^/' '' ) :r )] ( or file { :status 404 :body 'not…
Modern-day computing is fast. Incredibly fast ! For most tasks, the feedback can be considered instantaneous. Even the slowest languages used in production, like Python, are considered fast enough for the majority of tasks, and if not, there are almost always faster alternatives you could choose from. Modern-day CPUs are speedy boys indeed, but it’s not just CPUs that are great. RAM too is…
I’m continuing my work on fennel-cljlib , my port of clojure.core and some other core libraries, focusing on porting missing functions and features to it. One such feature, which I sometimes miss in Lua and Fennel, is dynamic binding . The Lua VM doesn’t provide dynamic scoping as a language feature, and Fennel itself doesn’t introduce any concepts like Clojure’s Var .…
Let’s set the tone for this post right away, I just want to get this out of my system: I despise the rise of AI in tech. Coding assistants, chat-bots, vibe-coding, agents. Oh, the vibe coding… WTF? Figure 1: This will be an “old man yells at cloud” type of post. I don’t like AI in general, although I know that neural networks can be used for good. Before you accuse…
If you know Python or do a lot of shell scripting (or even write in Perl), you’re probably familiar with the ability of these languages to reference variables or even expressions from string literals. In a shell, it is possible to do this: echo 'Hello, $user ' # prints: Hello, <your username here> echo '2 + 2 = $( echo 2 + 2 | bc ) ' # 2 + 2 = 4 A similar feature exists for Python with…
I’ve been working on adding a dynamic font-locking for fennel-mode for a while now. The first attempt started years ago, in July 2022, and were quite crude. It consisted of sending a special code to the REPL that would return me a list of macro names, and then I created a regular expression that matched all these names for syntax highlighting. This had several problems. First, this meant…
Somehow I’ve missed the fifth anniversary of my blog! Oh well. Well, it’s not that big of a deal, but I want to reflect on my blogging a bit. I started this blog on January 27th, 2020 with the following line: This is the first public post that I wrote because I’ve finally thought that I’m clever enough to do so. And that’s one of the most important decisions I made in…
I just released a new version of the deps.fnl project! After getting some feedback on the 0.1.0 version and addressing most of it, I’m ready to present a new version with improved dependency and conflict handling. Major changes The deps.fnl file format The :deps field was changed back to use maps, as it was during the prototyping stage: { :deps { 'https://gitlab.com/andreyorst/async.fnl' {…
I’d like to present a new project, aimed at one of the areas where the Fennel ecosystem can be improved - project dependency management. Other programming languages have tools to pull in, build, and load external dependencies. Java has Maven, Clojure has Leiningen and other projects like this, Python has Pip and Poetry, and Lua has Luarocks. All these tools provide ways for pulling in…
Recently I was participating in a conversation about popular programming languages and I brought up Lua. I was met with a response like this: Lua? Can you even do anything with this language? The conversation then shifted towards discussing modern dynamic languages, mostly Python, and how it gives you everything Java does without being as complicated as Java. I’m not a Python fan - in fact,…
What a year! Not as productive as last year, with only 18 posts this time (19 including this one), but I decided to post less for several reasons. The first one, is that right at the start of this year I had some events in my personal life that had an impact on my passion for writing. I’ve pretty much recovered since, but this explains some quietness in the blog during February. The second…
After watching this year’s EmacsConf and seeing Guile Emacs being resurrected I thought to myself - why limit ourselves to Guile? Sure, Guile isn’t just a Scheme implementation, thanks to its compiler-tower-based design. Other languages exist for Guile VM, such as Emacs Lisp, and Guile manual lists the following languages with various stages of completeness: ECMAScript Brainfuck Lua…
During the course of my life, I was mainly doing things blindly. Not that I’m actually blind, what I mean is that I didn’t study that much. Instead, I always preferred to rediscover things by myself. For the most part. When I was little, I didn’t have any particular hobbies. My childhood mainly consisted of playing outside with friends, watching cartoons on TV, and playing…
One thing I like about Lua is that it has a limited amount of built-in types and data structures. There are no objects, just tables. And if you need a custom behavior, a metatable can be attached to any table to extend it with custom methods that integrate with the rest of Lua runtime. However, this is both a blessing and a curse. And unfortunately, Lua developers made a huge mistake by breaking…
I’ve been absent for a while - you may have noticed that compared to the previous year, I posted a lot less this time. There are two closely related reasons for that. First, I felt burned out from programming. Second, I finally picked up a guitar after five or more years and started recording again. Thus, now I only do hobby programming when I feel passionate or challenged in an entertaining…
When Clojure 1.12.0 was released in September, the release note had a lot of cool features, such as virtual threads, but one feature caught my eye in particular: support for Java Stream s and functional interface support. That was just what I needed at work to port one of our internal libraries to Java, to make it easier to reuse from projects written in different JVM languages. Little did I know…
This is a continuation of the previous post on game development with the LÖVE game engine. I’m slowly appreciating the freedom it gives, compared to the TIC-80 experience. One of such freedoms is the fact, that LÖVE is a well-behaving console application. When you launch TIC, it boots up into a console: If you do so from a terminal emulator, you can see that the same console is there too:…
I spent the previous ten days on vacation. Usually, I try to go off once or twice a year to somewhere where I can just passively relax - usually, it is some sea resort. This year I decided to go to the Republic of Türkiye and spend my time at the beach without any major attractions. The problem is - I get bored pretty quickly and my brain wants to do something. I took with me my trusty Nintendo…
fnl-http is my current passion project - I spend a lot of free time tinkering with it, and the last week was spent on testing and fixing bugs. As you may know, I made a testing framework, called fennel-test , which has a dedicated test runner, and a set of macros for writing tests. I use it in all of my projects, and oftentimes, some project requires more features that are currently available in…
In the last post two weeks ago I described the process of making an asynchronous HTTP/1.1 client from scratch (minus the socket part). At the end, I mentioned that there’s a lot more to implement: Now, of course, that’s not all that needs to be implemented. In its current state, this client doesn’t support responses that do not specify the Content-Length or produce a response…
A while ago, I made a library for asynchronous programming in Fennel. It’s based on Clojure’s core.async vision of asynchronous programming using only channels. As an experiment, I’ve added a TCP support layer in that library, allowing one to create a TCP channel, and use it in the same way as a regular channel. My original plan was to implement a small asynchronous HTTP client…
So, here’s a question - when were you last excited for a new phone? Well, I mean really excited? Here’s the thing. Phones are so boring today that most retail stores show you the backside of the phone . Because from the front they all look exactly the same. Do you remember the old days when phone manufacturers fought for your money by trying to make cool-looking phones? Nokia and…
I’m not sure if this is a new thing or not, and I’m too lazy to look it up as it’s 3 AM right now, so here it is. I’ve been thinking about state machines lately, and how Clojure’s multimethods are a cool way to implement a state machine. Multimethods are somewhat like pattern matching, in a way, and you can use them to do some declarative programming in Clojure, like…
For quite a long time programming was my main hobby. I enjoyed it, as I felt like I was creating something (hopefully) useful, and the problems I tried to solve were making my brain-cogs turn. However, recently it seemed to change, or at least, I’m feeling my usual burnout a bit harder than usual. You may remember, recently I made a (now unlisted) post about taking a break from writing and…
There was a weird thought going over and over in my head, regarding my Emacs configuration, and it extends to the other projects I do both at home and at work. You see, my configuration is riddled with custom code, and up until recently I had mixed feelings about that. For example, I have a custom piece of code to automatically switch themes, based on the dark mode setting in my desktop…
Maybe I’m “beating a dead horse” here, but I haven’t thought about programming languages in this particular way before, so I decided to share the thought anyway: Most programming languages I know are designed like it’s still 80’s, and all we have are textual interfaces, and single-core CPUs. Well, the last part isn’t entirely correct so to speak - many…
I’ve been working with Clojure professionally for four years now, and I made some posts about the language in the past. Clojure is a great language, although not without its fair share of things to consider. In other words, I don’t see Clojure as an ideal language by any means, and it’s not suitable for every type of project. Still, the language is my favorite among others, and I…
The unexpected part! I liked hacking on Lox in Zig a lot, so I decided it would be great to make some changes to the language. It should be good for a better understanding of the book’s material, and probably will be a lot of fun! Minor changes from the book I looked back on what we’ve done in the book and decided to do some tweaking. First, I made print to be a function and not a…
This is a second post about the Crafting Interpreters book by Robert Nystrom. In the first post, I’ve described my experience with the first half of the book, and the challenges of using a different language with different idioms and practices. This post will be no different, although I have a bit more to discuss, and the contents aren’t actually ~2-year-old weak impressions and…
This year certainly was a productive one for me. I’ve written ~40 posts, have many more in the works, made a few new projects in Fennel and Clojure, and changed more of how I spend my time overall. The last year’s recap I mentioned that I’m no longer available on most social networks - this certainly helps me keep a more healthy mental state. I feel that I can keep my focus for…
The title says it all. No, really, I’m astonished at how much software is basically useless without an internet connection. Net is no longer something additional to your daily tasks, it is essential for your daily tasks. Just recently, I installed GSConnect, a GNOME addon that implements the KDE Connect protocol. I use the Fedora Silverblue, and perhaps it doesn’t come with Open SSL,…
I decided to give Janet another look - I’ve mentioned Janet before in this blog, and I have my thoughts on it. However, I have never actually interacted with the language that much - I only read its documentation and some code. Recently, I found this interesting post: My Kind of REPL by Ian Henry. It’s an interesting post, and I really liked the Braille plotting library they mentioned…
Have you tried using the GNOME Software? This thing: Do you use it? Are you even using GNOME? Oh, sorry, I think should point this out, it’s kinda important - I’m asking the developers of GNOME Software. Because, apparently, they don’t. OK, let’s start this post over. GNOME Software Wed, Dec 6, 2023 @rant GNOME tools ~8 minutes read GNOME Software, or, just, Software, is an…
Today I would like to discuss the Crafting Interpreters book by Robert Nystrom. It’s a book about designing an interpreter for a dynamic programming language called Lox. Well, not exactly. It’s split into two parts - in the first is about crafting a tree-walking interpreter, and the second is about writing a complete bytecode VM. I’m also going to write two posts, one for each…
I’m feeling ranty this week for some reason. Today will be no different and I’ll post another rant on the software world but not about programming. Instead, I want to tip into the consumer application world, and shit on the current state of music players on GNU/Linux specifically, although the situation is as bad as on other platforms IMO. Not long ago I bought a new set of headphones…
Tree-sitter became more widespread and Emacs took notice and included a bunch of <lang>-ts-mode as alternatives to <lang>-mode into the core. This is good news and a welcome change, but I have some concerns about the approach. When I first saw the Tree-sitter talk by Max Brunsfeld I was concerned that the language highlighting “fix” they’re talking about is too much. Here are the…
I don’t get it - it’s the simplest way to enable dark mode for your website that works across all platforms. It works on Linux, Android, MacOS, iOS, and maybe even on Windows (I didn’t test it, I have no Windows). I see websites that either use JS to do that or do no dark mode at all. Some time ago I started using the Stylus extension for Firefox to override CSS for websites that…
In the last post on the subject I mentioned: …And yeah, I felt burned up a lot, and considered skipping a month maybe… So, yeah. I left the jam. And I’m stopping my gamedev marathon as well. Realizing that it was a struggle rather than a self-motivation attempt helped to make the decision. Well, yes, I wanted to try this kind of extreme-paced five-month project - it is an interesting…