RSSAmplifier

Blog

Andrey Listopadov

All posts by Andrey Listopadov

andreyor.stRSS feed ↗98 posts

Latest posts

Burnout 2026

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…

Clojure on Fennel part four: Parsing (again)

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…

Better slopes in AABB collision systems

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…

Spring Lisp Game Jam 2026

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…

Clojure on Fennel part three: parsing

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…

Clojure on Fennel part two: immutable.fnl optimizations

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…

Clojure on Fennel part one: Persistent Data Structures

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…

Slopes in AABB collision systems

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…

2025 Recap

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…

MacOS Music Players

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…

GNOME is better macOS than macOS

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…

Replacing clojure-lsp with clj-kondo and Refactor-nREPL

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,…

Implementing SSE with fnl-http and async.fnl

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…

Effects of Slow and Fast systems

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…

Implementing dynamic scope for Fennel and Lua

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 .…

Am I becoming obsolete or just older?

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…

String interpolation in Lua

If you know Python or do a lot of shell scripting (or even write in Perl), you&rsquo;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…

Dynamic font-lock for Fennel

I&rsquo;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…

Blog - fifth anniversary

Somehow I&rsquo;ve missed the fifth anniversary of my blog! Oh well. Well, it&rsquo;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&rsquo;ve finally thought that I&rsquo;m clever enough to do so. And that&rsquo;s one of the most important decisions I made in…

deps.fnl 0.2.2 released

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&rsquo;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' {…

deps.fnl - a new dependency manager for Fennel projects

I&rsquo;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…

Tiny OOP in Lua

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&rsquo;m not a Python fan - in fact,…

2024 Recap

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&rsquo;ve pretty much recovered since, but this explains some quietness in the blog during February. The second…

Extending Emacs with Fennel

After watching this year&rsquo;s EmacsConf and seeing Guile Emacs being resurrected I thought to myself - why limit ourselves to Guile? Sure, Guile isn&rsquo;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…

Doing things blindly

During the course of my life, I was mainly doing things blindly. Not that I&rsquo;m actually blind, what I mean is that I didn&rsquo;t study that much. Instead, I always preferred to rediscover things by myself. For the most part. When I was little, I didn&rsquo;t have any particular hobbies. My childhood mainly consisted of playing outside with friends, watching cartoons on TV, and playing…

Extending JSON encoder with custom types

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…

Streaming and receiving chunked multipart data with fnl-http

I&rsquo;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…

Lazy Sequences and Java Streams

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…

Interactive game development with LÖVE

This is a continuation of the previous post on game development with the LÖVE game engine. I&rsquo;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:…

Boredom and gamedev

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 - testing with fennel-test

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…

fnl-http Improvements

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&rsquo;s a lot more to implement: Now, of course, that&rsquo;s not all that needs to be implemented. In its current state, this client doesn&rsquo;t support responses that do not specify the Content-Length or produce a response…

Asynchronous HTTP client for Fennel

A while ago, I made a library for asynchronous programming in Fennel. It&rsquo;s based on Clojure&rsquo;s core.async vision of asynchronous programming using only channels. As an experiment, I&rsquo;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…

Why today&#39;s phones are so boooooring?

So, here&rsquo;s a question - when were you last excited for a new phone? Well, I mean really excited? Here&rsquo;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…

Lazy state machines

I&rsquo;m not sure if this is a new thing or not, and I&rsquo;m too lazy to look it up as it&rsquo;s 3 AM right now, so here it is. I&rsquo;ve been thinking about state machines lately, and how Clojure&rsquo;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…

Hobbies

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&rsquo;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…

Accepting your own solutions to your own problems

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…

Programming languages are stuck in the 80s

Maybe I&rsquo;m &ldquo;beating a dead horse&rdquo; here, but I haven&rsquo;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&rsquo;s still 80&rsquo;s, and all we have are textual interfaces, and single-core CPUs. Well, the last part isn&rsquo;t entirely correct so to speak - many…

Using transducers

I&rsquo;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&rsquo;t see Clojure as an ideal language by any means, and it&rsquo;s not suitable for every type of project. Still, the language is my favorite among others, and I…

Thoughts on Crafting Interpreters - Part 3

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&rsquo;s material, and probably will be a lot of fun! Minor changes from the book I looked back on what we&rsquo;ve done in the book and decided to do some tweaking. First, I made print to be a function and not a…

Thoughts on Crafting Interpreters - Part 2

This is a second post about the Crafting Interpreters book by Robert Nystrom. In the first post, I&rsquo;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&rsquo;t actually ~2-year-old weak impressions and…

2023 Recap

This year certainly was a productive one for me. I&rsquo;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&rsquo;s recap I mentioned that I&rsquo;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…

We&#39;ve become overdependent on the net

The title says it all. No, really, I&rsquo;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&rsquo;t come with Open SSL,…

Janet

I decided to give Janet another look - I&rsquo;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&rsquo;s an interesting post, and I really liked the Braille plotting library they mentioned…

GNOME Software

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&rsquo;s kinda important - I&rsquo;m asking the developers of GNOME Software. Because, apparently, they don&rsquo;t. OK, let&rsquo;s start this post over. GNOME Software Wed, Dec 6, 2023 @rant GNOME tools ~8 minutes read GNOME Software, or, just, Software, is an…

Thoughts on Crafting Interpreters - Part 1

Today I would like to discuss the Crafting Interpreters book by Robert Nystrom. It&rsquo;s a book about designing an interpreter for a dynamic programming language called Lox. Well, not exactly. It&rsquo;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&rsquo;m also going to write two posts, one for each…

Linux Music Players

I&rsquo;m feeling ranty this week for some reason. Today will be no different and I&rsquo;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…

Overcolorization

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 &ldquo;fix&rdquo; they&rsquo;re talking about is too much. Here are the…

Why no one uses @media (prefers-color-scheme: dark)?

I don&rsquo;t get it - it&rsquo;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&rsquo;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…

Gamedev marathon

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&rsquo;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…