I was able to finish reading all of “The Genius of Lisp“ by @cdegroot and the whole book was as good as the free preview (chapter 8). I was able to speed-read through the detailed explanations of concepts I already knew, like tail recursion, garbage collection, the Y-combinator, Currying functions, and so on. But there were parts where I slowed down and read carefully, like the section on the Universal Turing Machine, and some of the details of the IBM-704 system architecture. Also the story of how the first Lisp implementation was created when one of McCarthy’s grad students implemented an M-Expression calculator, this was described in slightly more detail than what I recall McCarthy himself explaining in his 1960 paper — that or I had just forgotten those parts of the story.

The tone of this book reminds me a lot of popular physics books like Stephen Hawking’s “A Brief History of Time,” which was aimed more at general audiences than professionals. That said, there is a lot to enjoy about this book for professionals like myself as well. There are many good stories about the principals designers of Lisp throughout. The sections on the commercialization of Lisp for the first AI boom of the 1970s and it’s subsequent “AI winter,” were very interesting to read. And if you are a teacher, you might like how some of the concepts in the book are explained.

And I would definitely recommend this very strongly to 3rd-year high school students, or 1st and 2nd year college students, who are more genuinely curious about how computers work and want to know more than just how to make the next billion dollar app.

The next #LispyGopherClimate show with @screwlisp I look forward to talking about this book some more.

#tech #software #Lisp #ProgrammingLanguages #SchemeLang #Scheme #Clojure #Emacs #EmacsLisp #RetroComputing #LispyGopherClimateShow

The Genius Of Lisp

I've not really posted anything on my #blog for a while, and one of the reasons was that every time I tried to, I ended up having to work on catching up on a bunch of #hugo changes before the blog would build because inevitable on one of my four "main" machines, the blog wouldn't build due to some backward-incompatible changes.

Any recommendation for a static site generator that takes backward compatibility a bit more seriously? I've used #Jekyll in the past but I haven't looked into the state of that ecosystem for years.

My strong preference would be for a static site generator written in #clojure, #ClojureScript, #CommonLisp or #emacslisp. Preferably one that integrates well with #isso for comments.

Not interested in a more "dynamic" system like Ghost - I moved away from WordPress quite a while ago to reduce the amount of maintenance and attack surface, and I don't want to go back.

@EFLS @mxp I only ever use "switch-buffer" and use fuzzy completion to find the buffer I want by name. The idea that buffers could have an order is mind boggling lol. I keep Emacs open through multiple projects and I end up with sometimes 10s to 100s of buffers open.

If it gets really bad I'll open ibuffer, mark ones I don't need anymore, and kill them that way

#emacs #emacslisp

Dive into the Emacs Reader dev stream! In this session the author tackles text selection & highlighting—live debugging, design choices, and Emacs Lisp tricks. Great for Emacs users and package authors who want practical tips and real workflow. #Emacs #EmacsLisp #OpenSource #LiveCoding #SoftwareDevelopment #Programming #English
https://tv.dyne.org/videos/watch/851e53de-08a8-4b6a-ba3c-67da4d6445c8
[09] Emacs Reader's Development: Working on Text Selection and Highlighting - 8/10/2025, 3:03:09 PM

PeerTube

Question for Emacs wizards. I found a strange thing which I could not understand after reading the documentation (https://www.gnu.org/software/emacs/manual/html_node/emacs/Initial-Options.html) and even after reading the startup files, shipped with my Emacs 30.2.

If I use the -q option — Emacs will add site-lisp directories to the load-path. But with -Q option — there are no site-lisp catalogs in the load-path. Why is this happens? 

Note: the option --no-site-lisp is not used in the both examples. So, as I understood after reading the https://www.gnu.org/software/emacs/manual/html_node/eintr/Site_002dwide-Init.html, even with --no-site-file (or -Q) the site-lisp catalogs should be added to the load-path in the both cases 

#Emacs #EmacsLisp #elisp #AskFedi

An obscure Emacs Lisp question:

This might be a question for the mailing list instead, but I’m trying to implement buffer-local variables in my #EmacsLisp interpreter, but in my test programs, there seem to be no functional difference between the “toplevel default” and the “default” value of a variable at all. When reading the documentation, it says this:

A variable can be let-bound to a value. This makes its global value shadowed by the binding; default-value will then return the value from that binding, not the global value, and set-default will be prevented from setting the global value (it will change the let-bound value instead). The following two functions allow referencing the global value even if it’s shadowed by a let-binding.

But the documentation seems to be wrong, but maybe I am missing something? Here is my test program:

(when (intern-soft 'x) (unintern 'x obarray)) (setq record nil) (defun record (where val) (setq record (cons (cons where val) record)) ) (defun record-comment (str) (setq record (cons str record)) ) (defun replay () (princ ";----------------------------\n") (princ "; lexical-binding: ") (princ lexical-binding) (terpri) (dolist (x (reverse record)) (cond ((stringp x) (princ x) (terpri)) (t (prin1 (car x)) (princ "; x => ") (prin1 (cdr x)) (terpri) )))) (record "lexical-binding" lexical-binding) (defvar x "global") (record 'x x) (make-local-variable 'x) (record '(make-local-variable 'x) x) (setq x "local") (record '(setq x "local") x) (record '(default-value 'x) (default-value 'x)) (set-default 'x "default") (record '(set-default 'x "default") x) (record '(default-value 'x) (default-value 'x)) (record '(default-toplevel-value 'x) (default-toplevel-value 'x)) (set-default-toplevel-value 'x "top-level") (record '(set-default-toplevel-value 'x "toplevel") x) (record '(default-value 'x) (default-value 'x)) (record '(default-toplevel-value 'x) (default-toplevel-value 'x)) (let ((x "inside-let-form")) (defvar x) (record '(let ((x "inside-let-form")) x) x) (setq x "let-local") (record '(let -- (setq x "let-local") x) x) (record '(let -- (default-value 'x)) (default-value 'x)) (set-default 'x "default") (record '(let -- (set-default 'x "default") x) x) (record '(let -- (default-value 'x)) (default-value 'x)) (record '(let -- (default-toplevel-value 'x)) (default-toplevel-value 'x)) (set-default-toplevel-value 'x "top-level") (record '(let -- (set-default-toplevel-value 'x "top-level")) x) (record '(let -- (default-value 'x)) (default-value 'x)) (record '(let -- (default-toplevel-value 'x)) (default-toplevel-value 'x)) ) (record-comment ";;after let") (record 'x x) (record '(default-value 'x) (default-value 'x)) (record '(default-toplevel-value 'x) (default-toplevel-value 'x)) (replay)

When you look at the output of the program, (default-value 'x) returns the same value as (default-toplevel-value 'x) regardless of whether it is inside of a let binding, and regardless of lexical or dynamic binding mode. Here is the above program’s output:

;---------------------------- ; lexical-binding: t x; x => "global" (make-local-variable 'x); x => "global" (setq x "local"); x => "local" (default-value 'x); x => "global" (set-default 'x "default"); x => "local" (default-value 'x); x => "default" (default-toplevel-value 'x); x => "default" (set-default-toplevel-value 'x "toplevel"); x => "local" (default-value 'x); x => "top-level" (default-toplevel-value 'x); x => "top-level" (let ((x "inside-let-form")) x); x => "inside-let-form" (let -- (setq x "let-local") x); x => "let-local" (let -- (default-value 'x)); x => "top-level" (let -- (set-default 'x "default") x); x => "let-local" (let -- (default-value 'x)); x => "default" (let -- (default-toplevel-value 'x)); x => "default" (let -- (set-default-toplevel-value 'x "top-level")); x => "let-local" (let -- (default-value 'x)); x => "top-level" (let -- (default-toplevel-value 'x)); x => "top-level" ;;after let x; x => "local" (default-value 'x); x => "top-level" (default-toplevel-value 'x); x => "top-level"

#tech #software #Emacs

#Schemacs update

I decided to merge my #Scheme react-like declarative GUI framework (schemacs ui), even though the back-end isn’t completely bug-free yet. (It is still an experimental software project, so the main branch is the development branch).

Though it is written in pure #R7RS “small” Scheme, the only GUI back-end currently available is for Guile users who go to the trouble to install Guile-GI all on their own.

If Guile-GI is installed, put on your safety goggles and run this command in the Guile REPL:

(load "./main-gui.scm")

I haven’t tried getting it to work in a Guix shell for almost a year now, but my last attempt did not go well (it crashed while initializing Gtk). To anyone who wants to try the GUI, I am sorry to inconvenience you, but I’m afraid I just have to ask you to please install Guile-GI yourself using the old-fashioned ./configure && make && make install method. If anyone happens to be able to get it to work in a Guix shell, please let me know, or open a PR on the Codeberg Git repository.

The only examples for how to use (schemacs ui) are in the test suite and the Schemacs Debugger. The only documentation so far are the comments in the source code, though I did try to be very thorough with comments.

The “Debugui” debugger works, but only has one single feature: the eval-expression command, which is bound to M-: (Alt-Colon). This command works the same as in #Emacs but you enter a Scheme language command instead. The #EmacsLisp interpreter is not yet connected to the GUI.

Now that this is merged, I am going to work on a few tasks in the Emacs Lisp interpreter that have been pending for more than a few weeks now. Then, back to creating new features in the GUI toward the goal of making it a useful program editor. And also, of course, writing some more documentation.

#tech #software #R7RS #SchemeLang

#Schemacs update

I have been banging my head against #Gtk3 for the past 3 weeks and all progress has pretty much come to a stand-still. No matter how simple and straight-forward my GUI is, Gtk makes it simply impossible to get the layout correct. I am now convinced that programming my own layout algorithm from scratch and using the GtkLayout container (which lets you place widgets at arbitrary X,Y coordinates) is the only way to proceed at this point. It is soooo frustrating.

The #Gtk documentation is good, but not at all good enough. The people on the Gnome Discourse have been very kind and helpful, and I truly appreciate the engagement I have had there, but ultimately I am still not able to solve my problems.

I have decided I need find some way to keep making progress without postponing the release of the work I have done so far for an indeterminate length of time. So rather than work out all the bugs in this version before merging it to the main Git branch, what I will do instead is have the main program launch a debugger window. The debugger window will have all layout calculated in advance, and all widgets will be declared once and only once throughout the lifetime of the application to avoid the reference counting issues. Obviously the debugger GUI will be very rigid, but you will at least be able to edit files and run commands in a REPL within this debugger.

Then maybe I can merge the code I have written to the main Git branch, and people will at least be able to use it through the debugger. Maybe also I could use this debugger to help with writing my layout algorithm. Also, I need to get back to the Emacs Lisp interpreter, I haven’t worked on it in almost two months now.

#tech #software #Lisp #Emacs #EmacsLisp #Scheme #SchemeLang #R7RS

Can't get GtkScrolledWindow to use all available space, seems to ignore "vexpand" and "valign"

(In Gtk3) I am ordering elements in a GtkApplicationWindow. The app window’s top-level layout container is a GtkBox with vertical orientation. The box contains two elements, a GtkScrolledWindow (with a GtkTextView inside of it), and GtkLabel below for reporting messages. I made sure the top-level Box and the GtkScrolledWindow both have their expand properties set to TRUE, and both have their valign and halign properties set to fill. I made sure to call pack_start with the expand and fill argume...

GNOME Discourse
I wonder whether someone went through with the plain-text graph exercise from Emacs Lisp An Introduction by Robert J. Chasel and created a working package out of it? #Emacs #EmacsLisp

NEW BLOG POST: Custom sorting of mu4e headers

I love mu4e for dealing with email under Emacs: with a little Emacs Lisp you can make it do email how you want to do email.

https://jamesendreshowell.com/2026-01-08-custom-sorting-of-mu4e-headers.html

#emacs #mu4e #emacslisp

Custom sorting of mu4e headers