File: logo-web-teal-dark-1219030386.png (103.5 KB)
>Lisp is a family of programming languages with a long history and a distinctive parenthesized prefix notation. There are many dialects of Lisp, including Common Lisp, Scheme, Clojure and Elisp.
>Emacs is an extensible, customizable, self-documenting free/libre text editor and computing environment, with a Lisp interpreter at its core.
>Emacs Resources
https://gnu.org/s/emacs
https://github.com/emacs-tw/awesome-emacs
https://github.com/systemcrafters/crafted-emacs
>Learning Emacs
C-h t (Interactive Tutorial)
https://emacs-config-generator.fly.dev
https://systemcrafters.net/emacs-from-scratch
http://xahlee.info/emacs
https://emacs.tv
>Browse imageboards in Emacs Org-Mode
https://github.com/eNotchy/4g
>Emacs Distros
https://github.com/caisah/emacs.dz
>Elisp
Docs: C-h f [function] C-h v [variable] C-h k [keybinding] C-h m [mode] M-x ielm [REPL]
https://gnu.org/s/emacs/manual/eintr.html
https://gnu.org/s/emacs/manual/elisp.html
https://github.com/emacs-tw/awesome-elisp
>Common Lisp
https://lispcookbook.github.io/cl-cookbook
https://cs.cmu.edu/~dst/LispBook
https://gigamonkeys.com/book
https://lisp-docs.github.io
https://awesome-cl.com
>Scheme
https://scheme.org
https://standards.scheme.org
https://go.scheme.org/awesome
https://research.scheme.org/lambda-papers
>Clojure
https://clojure.org
https://tryclojure.org
https://clojure-doc.org
https://clojure.land
https://www.clojure-toolbox.com
https://mooc.fi/courses/2014/clojure
https://jafingerhut.github.io/cheatsheet/clojuredocs/cheatsheet-tiptip -cdocs-summary.html
>Other
https://github.com/dundalek/awesome-lisp-languages
>Guix
https://guix.gnu.org
https://nonguix.org
https://systemcrafters.net/craft-your-system-with-guix
https://futurile.net/resources/guix
https://github.com/franzos/awesome-guix
>SICP/HtDP
https://web.mit.edu/6.001/6.037/sicp.pdf
https://htdp.org
>More Lisp Resources
https://lisp.nexus
https://rentry.org/lispresources
prev thread: >>108879491
Showing all 179 replies.
>>
File: 1779664996678.jpg (200.6 KB)
>>108967280
LOOP > DO/DO*.
>>
>>
File: defense.png (127.0 KB)
https://www.anduril.com/rebooting-the-arsenal
I've been thinking about war lately.
Can Lisp be part of this?
Should Lisp be part of this?
>>
>>
>>
>>
File: file.png (33.6 KB)
>>108967756
Take a look at this very short book.
https://almightylisp.com/
It'll get you bootstrapped and competent in CL fairly quickly if you work through their examples. You probably already know some of what they're going to teach you. It'll fill in the gaps in your knowledge.
>>
>>108967726
why should engineers work for profiteering CEOs that lobby their governments for actions that negatively impact society's well being in exchange for higher GDP? what is the purpose of the United States of America? why is blackmail being used to force American officials' hands? what other tools are being used to force officials' hands?
>>
>>
File: lisp-alien-knight.png (190.5 KB)
>>108967726
>The Dynamic Analysis and Replanning Tool, commonly abbreviated to DART, is an artificial intelligence program used by the U.S. military to optimize and schedule the transportation of supplies or personnel and solve other logistical problems.
>DART was introduced to support military logistics planning and was utilized during preparations for Operation Desert Storm.
https://en.wikipedia.org/wiki/Dynamic_Analysis_and_Replanning_Tool
>Dynamic Analysis and Replanning Tool (DART) System/Subsystem Specification
https://archive.computerhistory.org/resources/access/text/2023/08/1028 05225-05-01-acc.pdf
>>
>>
>>
>>
>>
File: not-angry-fruit-salad.jpg (393.0 KB)
>>108968536
What theme is he using?
https://www.twitch.tv/j_blow/clip/InventiveArtsyGarbageOSfrog-FZxufO5y BFFA8bWY
>>
>>
>>
File: flammenwerfer.png (107.7 KB)
>>108967726
>Coalton is currently used in production to build defense and quantum computing software.
https://github.com/coalton-lang/coalton
https://www.youtube.com/watch?v=xuSrsjqJN4M
>>
>>
>>108972682
>naysayer
It looks like a pretty good approximation to me.
https://github.com/nickav/naysayer-theme.el
>>
File: barberry.png (1.3 MB)
A Wine Notebook and Database
https://www.barberry.io/
Made with Emacs
https://github.com/d12frosted/vino
https://github.com/d12frosted/vulpea
>>
>>
>>108974812
>vulpea
https://www.d12frosted.io/posts/2025-11-28-vulpea-v2-breaking-up-with- org-roam
This is really interesting. It has a lot of the same capabilities of org-roam, but it's more programmer-friendly. If you want to build systems on top of it, you can. Vino is an example this.
The question of how to build specialized databases was on my mind recently, and I'm glad I found something like this.
>>
File: aigp.png (126.8 KB)
>>108967726
Autonomous Drone Race
https://www.theaigrandprix.com/
>>
>>
>>108967756
>The current resources are not linear, it's hard to learn is what I am saying as nicely as possible.
How about "Practical Common Lisp", which is very good, and "Land of Lisp" which is fun?
But really, the core of Lisp can be explained more or less succintly:
- Everything is an expression
- Expressions are delimited by parenthesis ()
- Every expression evaluates to a value.
- Special values are T and NIL, consider them "true " and "null/false" but more in a minute...
- For logic operations or boolean operations, everything that is not NIL is considered true. T is also true because it is not NIL.
- There are many data types, most of them you know like integers or strings, but one you don't know is the SYMBOL.
- A symbol is just a token you can use to represent something, for example you can have a list with the elements (SCISSORS KNIFE PAPER STONE), scissors, knife, paper, stone can be symbols, in that case they're not variables because variables are replaced (evaluated) to another value; symbols just stay as their are, they evaluate to their own value.
- A typical use of a symbol is to pass options to a function, for example if i call a function like this:
(read-csv-file myfile :quote-mode :always)
both ":quote-mode" and ":always" are symbols too, which in this context would specify that the CSV file will always be quoted.
- In the previous example, symbols have ":" prepended. These symbols are called "keywords" and they have a small difference: they are global, not unique to a namespace ("package"), while regular symbols have their own namespace ("package")
>>
>>108975186
>500k
>win a job
how about the engineers that develop the tech get 50% of all profits made from the tech?
the engineers deserve the money more than any CEO or marketing dept. does.
a whole lot of words talking about bold engineers and shit.
>>
>>108975257
(continuation)
- to call a function "myfunction" with arguments 3.14 and "apple" the syntax would be:
(myfunction 3.14 "apple")
This will pass the values/arguments to "myfunction" and thus evaluating the expression to a value. (Remember, in Lisp, everything evaluates to a value or "returns a value" if you want to see it that way.) Functions are similar to what you have in Python: they have a name, arguments, can have variable arguments, optional arguments, keyword arguments, etc.
- however, if you write:
'(myfunction 3.14 "apple")
The prepended quote (') tells the Lisp compiler/engine ("lisp implementation" in proper terms) that we don't want to evaluate the function. This means your input evaluates to a LIST with three elements:
1. myfunction, a SYMBOL
2. 3.14, a float number
3. "apple", a string
- lists are the fundamental or main data structure. Lisp has a ton of functions to do all kinds of stuff with lists.
- Lisp source code (i.e. function definitions) is MADE OF nested LISTS. Think this twice. Lisp source code is made of lists, and Lisp has a ton of functions to do all kinds of stuff with lists.
- Thus you should be able to write procedural code that takes source code (a list) as input, and produces source code (a list) as an output. This would enable you to create code that transforms code. Such kind of procedure is called a MACRO.
- A macro, syntactically, is used exactly like a function. The difference is that a function is evaluated(called) at runtime while a macro is often called at compile time. Thus, when you compile your source code (for example when you compile a function), the Lisp compiler executes all macros, thus processing your source code to its final form, and then compiling it.
- Macros, then, allow you to extend the programming language as you wish. Macros are an essential feature of Lisp and a Lisp IDE has many features intended to make debugging and testing of macros easy.
>>
>>
File: cl-cookboook.cover.png (221.0 KB)
>>108974875
No problem. That book didn't exist when I decided to learn CL, but I think it would have sped up my learning process if I had access to it. With that said, there *is* one resource that I found myself going back to time and time again while I was learning CL, and I still reference it now.
The Common Lisp Cookbook
https://lispcookbook.github.io/cl-cookbook/
https://github.com/LispCookbook/cl-cookbook/
It's extremely practical in what it covers, and whenever I wondered "How do I do ___ in CL?" ...more often than not, I found the answer in this book. It's not even an exaggeration to say that over 90% of my CL knowledge came from skimming sections of this book when I needed help. I really like this book, and I'm thankful for @vindarel for maintaining it.
>>
>>108975771
For me it was https://dept-info.labri.fr/~strandh/Teaching/PFS/Common/David-Lamkins/ contents.html
>>
>>
>>
>>
>>
>>108975771
To anyone who uses pdf-tools in Emacs and uses `C-c TAB` (pdf-view-extract-region-image), there was a minor regression introduced about 6 months ago that makes this fail. The fix is here.
https://github.com/vedang/pdf-tools/pull/357/changes/f3f3bfe3289e006ab 9790428275fe6090b1d0212
It just changes a quote to a backquote.
If you installed or updated pdf-tools within the last six months, you might be affected.
>>
>>
>>
>>
Claude sucks at Clojure, it makes syntax mistakes and its training data is obviously outdated because it doesn't recognize many of the newer functions in clojure.core.
But, I've gotten pretty good results by making fairly detailed Malli schemas of the inputs and outputs, and the letting claude do the implementations.
>>
>>
>>108978712
>i can't think of anything more boring than writing schemas.
Writing docstrings easily tops it. Luckily, digital demons are pretty good at this.
>if i absolutely had to use a slopbot i would switch the roles
that was my approach at first, but it turns out the demons are bad at this kind of thing.
Honestly I very much dislike the agentic workflow where you let the demon write a bunch of code and then try to fix its shitty bugs. What I do enjoy is bouncing ideas off of ChatGPT, asking questions about best practices, talking about architecture.
>>
>>
>>
>>108980394
1. the state management (at least in the domains I write software for, it might work for games)
2. creating all these shitty ad-hoc interfaces instead of just letting me get and operate upon the data in the form of familiar, generic data structures.
>>
>>108980501
>creating all these shitty ad-hoc interfaces instead of just letting me get and operate upon the data in the form of familiar, generic data structures.
Thankfully, CLOS eschews this retarded idea altogether: classes are merely used for data representation, not "encapsulation" (which can be achieved already in much cleaner and general ways, such as using closures).
>>
>>108980501
You can choose to treat class instances as glorified read-only structs if you want to avoid the parts of OOP you don't like. This is similar to the path Julia took when they decided there would be no such thing as a class or object in Julia. They just have a hierarchical and parametric types and the ability to use generic functions to dispatch on a combination of types (which is one of the best parts of CLOS).
>>
I wrote a little JS to scrape a YouTube transcript and generate an org list with timestamps.
https://bpa.st/I6UA
What I would love to have is the ability to click on a timestamp and have a browser go that timestamp in the video. Furthermore, if I'm already watching the video and click on a timestamp, it should make the existing video seek to the new timestamp (without loading a new page).
How can I make Emacs send commands to a running browser in this way?
Here's the JS that generated the transcript.function getItems(segments) {
items = []
segments.forEach((seg, i) => {
const item = {
timestamp: seg.querySelector("div.ytwTranscriptSegmentViewModelTimestamp").innerT ext,
text: seg.querySelector("span[role=text]").innerText
}
items.push(item)
})
return items
}
function genOrgList(segments) {
const items = getItems(segments)
const orgList = items .map((item) => `- ${item.timestamp} :: ${item.text}`) .join("\n")
return orgList
}
// Usage: copy(genOrgList(segments))
/*
Usage:
// These selectors are probably pretty fragile.
// I don't trust YouTube to stay stable here.
transcript = document.querySelectorAll("#panels #contents")[0]
segments = transcript.querySelectorAll("transcript-segment-view-model")
copy(genOrgList(segments))
*/
>>
>>
>>108981813
you can just start an external process and give it the timestamp in the url, like
xdg-open https://youtu.be/zXHl03Fr8XY?t=17s
check out how 4g handles starting video players
https://github.com/eNotchy/4g/blob/85a02bfa41e99c7292fa923d72e4a1ad780 a8c2d/4g.el#L439
>>
>>
>>108920294
i think rms uses X11 too, given he's trying to install the osm package
https://lists.gnu.org/archive/html/bug-gnu-emacs/2026-06/msg00099.html
>>
>>108981958
>xdg-open
That was ok for the initial opening of the video. However, I don't know if I can get subsequent random seeking from emacs to the video player (whether it be a browser or mpv).
>>108982008
Hmm.. this was the closest to what I wanted.yt-dlp --write-auto-sub --sub-format=srt --sub-lang=en --skip-download https://www.youtube.com/watch?v=0getRxRo7wg
>>
if you actually use exwm over Ratpoison, StumpWM, Sawfish WM, or even any fucking DE, what are you even fucking doing?
btw Ratpoison is, to this day, the most intelligently designed WM I've ever used. I use Gnome these days btw
>>
File: ec937feabb9c1822c034a85983a08d8a-1339448172.jpg (17.7 KB)
>fucking around with ecl
>hmm let's see the c code this thing generates
>secrets man was not meant to know .c
Mybe ecl isn't the lisp solution for embedded shit that I'm looking for.
>>
>>108982128
what's the point in using something else? i already do most things in emacs. if i used a different WM i would need to manually select the emacs window every time i'd want to open a file manager or check email. that sounds tedious
>>
>>
Clojure has
>type hints
>spec/malli instrumentation, or :pre and :post assertions
>TypedClojure static type system
And you have to use all of them if you want the benefits that other languages achieve with just one unified system.
>>
>>108982419
The most realistic way to use Lisp in embedded right now is arguably something like ulisp or writing a custom Lisp interpreter.
Sadly, all existing non-toy CL/Scheme implementations are designed to run in a hosted environment. I think even CL in full could be run in a bare metal environment, but you really need an implementation designed for it.
>>
>>
>>
>>
>>108984123
>type hints
purely for performance, if you get them wrong, the program will still run, just more slowly.
>Spec/Malli
for RUNTIME validation. this is absolutely no different from writing some function that looks at user input to confirm the inputted string can be casted to a positive number within the inclusive range of 16--1058, even numbers only (except for 244, fuck 244). good luck having a compile-time type system deal with that without getting into proof systems and shit (yes, I know you can define a custom type for this number with an errable constructor, but you will run into constant type casting annoyances that make it not worth it. btw I'm doing research into this exact problem using Clojure ASTs for inference upon).
>:pre/:post assertions
use of these is much more subjective in experience. I personally never use them. I attach Malli schemas to the metadata of a function for validating input, and have a lib that will apply the args to both when explicitly called for (sometimes you KNOW you are passing correct data to a function and need no error checking, other times you don't know).
>Typed Clojure
a separate project that does traditional type checking at compile time for errors. I do not recommend it.
>>
>>108985989
>purely for performance
yes, that's the point. When I write static types in e.g. Dart, I both get the type safety and better autocomplete etc. AND I get to enjoy the performance benefits.
The neat thing about :pre/:post is that it always works, even in more obscure dialects like Squint.
>>
>>
File: HJa5aSQbYAA5w1g.jpg (47.8 KB)
>evil mode
>cool themes
>magit
>LSPs for Odin, Rust and Go
>Completion and code suggestions for said LSPs
Is this too hard to set up? I kinda want to drop Doom Emacs because it feels SLOW AS BALLS when doing anything. But at the same time I'm not sure at all whether to dive into creating my own config. Seems more intimidating than when I got into nvim years ago.
>>
>>
>>
>>108986356
>LSPs for Odin, Rust and Go
if they're on your system, eglot should just use them.
>Completion and code suggestions for said LSPs
Just start eglot while in a project written in one of those languages and see if eglot does what you want.
Completion is a bitch to set up well. Here's my config:(fido-vertical-mode 1)
(setopt
icomplete-in-buffer t
completions-detailed t
completion-show-help t
completion-auto-help 'lazy
completion-cycle-threshold 3
tab-always-indent 'complete
completion-styles '(basic partial-completion flex)
completion-category-defaults nil
completion-category-overrides
'((file (styles partial-completion flex))
(buffer (styles flex))
(project-file (styles partial-completion flex))))
;; ghost text completions
(global-completion-preview-mode 1)
(with-eval-after-load 'completion-preview
(setopt completion-preview-exact-match-onlyt))
(minibuffer-depth-indicate-mode 1)
(minibuffer-electric-default-mode 1)
>>
>>
File: 1755391577047144.png (2.0 MB)
new emac just dropped
https://lists.gnu.org/archive/html/emacs-devel/2026-06/msg00118.html
https://alpha.gnu.org/gnu/emacs/pretest/emacs-31.0.90.tar.xz
>>
>>
>>
>>
>>
>>
>>108986356
Setting up evil and magit is straightforward.
1. Give yourself access to MELPA so that you can install packages from https://melpa.org/
2. Write use-package expressions for each package you want to install.
Let's do the relatively easy part first.;;;; Setup MELPA access
(require 'package)
(package-initialize)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
;;;; Put customizations in a separate file.
(setopt custom-file (locate-user-emacs-file "custom.el"))
(load custom-file :no-error-if-file-is-missing)
;;;; Packages
;; https://github.com/emacs-evil/evil
(use-package evil
:ensure t
:init
(setq evil-want-integration t)
(setq evil-want-keybinding nil)
:config
(evil-mode 1))
;; https://github.com/emacs-evil/evil-collection
(use-package evil-collection
:after evil
:ensure t
:config
(evil-collection-init))
;; https://github.com/magit/magit
(use-package magit
:ensure t)
;;;; TODO: General Config
At the end of this config, maybe you could try some of the things from:
>>108986511
>>
>>108986356
>>108990669
When you add `:ensure t` to the use-package expression, that tells Emacs to download the package if it doesn't have it already.
Also, although you're using evil, there are a few vanilla keybindings that work well with evil, especially while you're editing Elisp.
M-; (comment-dwim)
C-M-h (mark-defun)
I recommend giving them a try.
Also, if you have a question about anything in your init file, put your cursor on it and hit `C-h o` (describe-symbol). The ability to query Emacs is one of the most important skills to develop.
>>
>>108990695
There's also C-M-x (eval-defun). While you're writing your config, there's no need to restart Emacs. You can write a use-package expression and when you're happy with it, hit C-M-x while your cursor is inside it to run the expression. Emacs will then install the package.
>>
File: carp.png (99.7 KB)
>>108989600
https://github.com/carp-lang/Carp
https://github.com/carp-lang/Carp/blob/master/docs/LanguageGuide.md
>Carp borrows its looks from Clojure but the runtime semantics are much closer to those of ML or Rust.
>>
File: 61dnV42UYaL.jpg (102.9 KB)
>>108967280
I am using emacs in the terminal with evil mode enabled
Should i just switch to vim at this point?
>>
>>
>>108990931
I have been looking at neovim (lua) and desu you are 100% right, i hated lisp starting off but now i see the appeal
Still i wonder how many people use emacs inside term+tmux vs using it as a complete os replacement
>>
>>
File: 2026-06-06_02-52-11.png (299.3 KB)
>>108880949
I've made some improvements.
- It should work with either sly or slime now.
- It requests and displays extra metadata about the text.
- The *ichiran* buffer uses org-mode now with the headings collapsed by default. (You only get extra detail when you explicitly open a heading.)(defun ichiran-romanize (phrase)
"Romanize a Japanese PHRASE using ichiran.
Results are displayed in an *ichiran* `org-mode' buffer.
For this to work:
1. `sly' or `slime' must already be running.
2. `org-babel-lisp-eval-fn' must be set apporpriately.
3. The ichiran CL library must be loaded into that sly (or slime) instance."
(interactive "MPhrase: ")
(let* ((result (funcall org-babel-lisp-eval-fn
`(cl:multiple-value-list
(ichiran:romanize ,phrase :with-info t))))
(romanized-text (car result))
(romanized-info (cadr result))
(buffer (get-buffer-create "*ichiran*"))
(window (or (get-buffer-window buffer)
(switch-to-buffer-other-window buffer))))
(with-current-buffer buffer
(delete-region (point-min) (point-max))
(unless (equal major-mode 'org-mode)
(org-mode))
;; Insert `romanized-text' at the top.
(insert (concat romanized-text "\n"
;; Insert a level 1 org headline for each segment.
(cl-loop for part in romanized-info
concat (concat "* " (car part) " = " (cdr part) "\n\n"))))
;; Fold headlines on initial load.
(org-cycle '(4)))))
https://github.com/tshatrov/ichiran
I really like getting Elisp and CL to work together, sending sexps back and forth.
>>
>>
>>108991143
A hypothetical Scheme Emacs should be able to do something very similar. I'm no Scheme expert, but I'm sure it would be able to build a sexp with CL code to execute and receive an sexp alist back. It's true that Elisp and CL are more similar to each other than they are to Scheme, but in this case, I don't think it would matter that much. They can all understand each other's sexps.
>>
>>108991143
I think Stallman is very aesthetically motivated and I agree with him that Scheme is the most beautiful of all the Lisp dialects, all of which are pretty, but some of which are really standout gorgeous even among other pretty languages.
But I think of Common Lisp as more like a language which sacrifices some conceptual beauty for power. It’s undeniable that in terms of development experience it’s extremely hard to touch Common Lisp. Stallman’s concerns were more objections over what went into CL as it was being formalised and some of these concerns are fair while others are petty and others I think are downright bad ideas (he didn’t like the keyword usage in CL, for example).
I’ve mostly used CL myself because once you use the restart system, going back is so hard, but I think anyone who gets really into Lisp has to find a special fondness for Scheme
>>
>>
>>
>>
>>
>>108991740
To be honest I found Guix is surprisingly weird with this. Emacs and Guix Home tend to clash in some respects and unfortunately because Guix Home doesn’t seem to like stuff like pdf-tools, it seems to be easier to let emacs handle its own packages and Guix handle the rest
>>
>>108967280
My favorite Lisp is GNU Make
https://okmij.org/ftp/Computation/Make-functional.txt
>>
>>
File: carp.x4.png (868.5 KB)
>>108990823
testing
>>
>>
>>
One very questionable default behavior of Emacs is that load-theme doesn't disable previously loaded themes. For example, if I started vanilla Emacs (via emacs -Q) and did:
M-x load-theme tango RET
M-x load-theme light-blue RET
M-x load-theme modus-operandi-tinted RET
My custom-enabled-themes would be:(modus-operandi-tinted light-blue tango)
All 3 themes are loaded simultaneously! I don't think this is what most people expect, and it often leads to strange bleed-through between themes.
My solution is to apply a :before advice on load-theme.(defun disable-loaded-themes (theme &optional no-confirm no-enable)
"Disable any loaded themes before enabling a new THEME.
This prevents overlapping themes; something I would rarely want.
THEME, NO-CONFIRM, and NO-ENABLE are ignored in this advice function."
(dolist (theme custom-enabled-themes)
(disable-theme theme)))
(advice-add #'load-theme :before #'disable-loaded-themes)
>>
>>
File: elpaca-recent-issues.png (60.7 KB)
>>108987649
I'm not an elpaca user, but it looks like you're not alone in experiencing breakage due to the 0.2.0 release.
https://github.com/progfolio/elpaca/issues
Even prominent Elisp authors like minad have chimed in.
>>
>>
>>108986511
>>108990669
>>108990695
Thanks anons and sorry for the very late reply. I will maybe give this a shot, what the hell?
I might come back to the thread for questions. Thanks again.
>>
>>108993206
No, the problem is that:
1. compat got added to core as a stub in emacs 30
2. package managers do not update packages included with emacs by default (a reasonable default for other packages but defeats the entire purpose of compat)
3. a bunch of packages now want to use compat 31 and package managers wont update the built in compat 30 unless you explicitly tell them to
This was an easily foreseeable problem that I just assumed had been thought through when compat got added in emacs 30 but I guess not.
>>
>>
>>
>>108980501
>>>108980394
>1. the state management (at least in the domains I write software for, it might work for games)
>2. creating all these shitty ad-hoc interfaces instead of just letting me get and operate upon the data in the form of familiar, generic data structures.
1. Debugging software which depends on state change is easy in Common Lisp with an IDE because the whole language was intended for managing mutable program state.
2. I feel the same about interfaces. CLOS is different and closer to "operate upon the data with no ceremony"
>>
>>108985169
>I think even CL in full could be run in a bare metal environment
That's what Movitz and Mezzano do; they're full operating systems written in Lisp and thus they run on a bare-to-the-metal Lisp implementation.
Now, they're not production-quality software.
>>
>>108991143
>And to think Stallman would have preferred Scheme to CL
for ideological reasons only; stallman WAS a Common Lisp developer and got butthurt by the CL community when the split between Symbolics and Lisp Machines Inc happened.
Thus he started to talk shit about CL.
The reality is, his Emacs Lisp started as something contrary to CL, but since decades ago, CL features had to be incorporated on the optional and ubiquitous "cl-lib"...
>>
>>108991272
>But I think of Common Lisp as more like a language which sacrifices some conceptual beauty for power. It’s undeniable that in terms of development experience it’s extremely hard to touch Common Lisp
moreover, and something not mentioned often: Common Lisp is built for interactive programming from the very fundamentals, while Scheme is intended to be used with the (outdated, lesser, boring) "compile, run, fix your source code, compile again, run again" development style.
IMO this is what makes Common Lisp win, for me the full featured interactive development is the #1 reason to use Lisp.
>>
>>108994293
Yeah I agree, I’d prefer Scheme outright if it had restarts. Continuations are nice, but restarts are such an amazing feature it almost ruins you for development in any other language or even dialect of Lisp, including Scheme.
>>
>>
>>108994275
Honestly, now that Elisp is close to switching to lexical scoping by default, the overlap between the two languages is even larger than it ever was. A lot of CL code will run perfectly fine unmodified in Elisp and vice versa.
I do think that Scheme has an overall cleaner and "tighter" design, but I don't think it's suitable for a highly interactive and dynamic system such as Emacs: this is the one scenario where dynamic scoping really helps.
>>
>>
>>
>>
>>108986356
>cool themes
There are a ton of themes out there. Many can be previewed here:
https://emacsthemes.com/themes/
Some are more well-behaved than others. By that, I mean they have sufficient "face coverage" which means that everything that needs to be colored is colored. For example, there are many older themes that neglect to theme the tab bar. That always irked me, because the color selection might otherwise be agreeable to my taste, but it makes the theme unusable unless I add extra customization to fill in the gaps. I vouch that the following theme packs are well-behaved.;; https://github.com/catppuccin/emacs
(use-package catppuccin-theme
:ensure t
:defer t)
;; https://github.com/doomemacs/themes
(use-package doom-themes
:ensure t
:defer t)
;; https://github.com/protesilaos/ef-themes
(use-package ef-themes
:ensure t
:defer t)
;; https://github.com/ogdenwebb/emacs-kaolin-themes
(use-package kaolin-themes
:ensure t
:defer t)
After you've installed the themes you like, you can pick one to enable.;; To prevent Emacs from asking you if you are sure, add :no-confirm.
(load-theme 'kaolin-temple :no-confirm)
>>108992836
I also highly recommend adding the following to your config, so that themes don't bleed through into each other.(defun disable-loaded-themes (theme &optional no-confirm no-enable)
"Disable any loaded themes before enabling a new THEME.
This prevents overlapping themes; something I would rarely want.
THEME, NO-CONFIRM, and NO-ENABLE are ignored in this advice function."
(dolist (theme custom-enabled-themes)
(disable-theme theme)))
(advice-add #'load-theme :before #'disable-loaded-themes)
>>
>>108995053
>Claude told me
kek
>Do I install the regular package through dnf?
yes. if you actually want to maximize for performance you'd either have to use terminal emacs or compile with the lucid toolkit if you want gui, but that comes with its own tradeoffs like shitty font rendering and inaccurate colors
>>
>>108995205
Sometimes, you come across themes that are neither on MELPA or ELPA. They're usually only available through git. This is how you install them.(use-package south-theme
:vc (:url "https://github.com/SophieBosio/south" :rev :newest :branch "main"))
>>
>>108995255
The screenshot from
>>108991103
is using lucid, and I think the font rendering is fine. I compiled my emacs with the following system-configuration-options value."--with-x --with-x-toolkit=lucid --with-tree-sitter --with-dbus --with-native-compilation=aot --with-file-notification=inotify --with-mailutils --with-xml2 --prefix=/opt/emacs-30.2b CC=gcc-14"
>>
>>
>>
File: file.png (85.6 KB)
Sup guys
>>108986356
here again
This was hard at first but it kind of flattened out. I think this is usable for now. All I haven't configured for now, because I have to go out now, is LSP/Eglot. But well, I will try tomorrow. Hopefully the performance will be way better than with my Doom install.
This is also me, btw:
>>108994382
I installed from dnf with pgtk enabled, I'll see how it goes when doing some real work.
>>
>>108992836
>>108994158
themes aren't only for visual customizations. and besides, newfags who'd be confused by this should simply use M-x customize-themes instead of M-x load-theme
>>
>>108995255
>>108995313
>>108995411
i don't understand why the choice of toolkit would have an effect on fonts. the choice of font libraries is a different thing when you're configuring emacs
>>
>>
>>
>>
>>
>>
Elfeed 4.0.0 was just released by the new maintainers.
https://github.com/emacs-elfeed/elfeed/blob/main/NEWS.org#version-400- 2026-06-06
It looks like it got a lot of improvements.
The changelog from the last release is pretty long.
>>
>>
>>108996255
>So it turns out “all languages eventually rediscover Lisp” applies to Elisp rediscovering the logic of Common Lisp
>Fucking brutal mog for RMS
Yep. RMS is a very smart guy, but every human has a weakness. If he had let go of his angry ego, he would have written Emacs in Common Lisp and our current Emacs would probably run 3x or 10x faster, and every single module since the beginning of time would be using local variable scope by default.
>>
>>108995850
>I’m pretty sure scheme can be… essentially… turned into common lisp by adding functions and macros.
Yes but that wouldn't make too much sense.
You use Scheme when there's a Scheme implementation that suits your purposes. And Scheme implementations will always be easier to build than Lisp implementations; simply because Scheme requires less features.
It is true that Scheme is better designed, after all it's a newer language. But if you want an industrial-strength, battle-proven, write-today-run-for-decades language, Lisp fits the bill.
Scheme is like a sporty nimble BMW 2-cylinder motorcycle while CL is like a Mercedes G-class V12 powered offroader.
>>
>>
>>108996255
>>108996625
am i the only one who likes elisp's independence? i feel like it shields it away from a lot of bad trends. the vibe sloppers of the lisp world seem to be mostly prominent among the CL crowd, for example
>>
>>108996655
>Scheme predates Common Lisp.
Yes, but...
Common Lisp inherits and implements a ton of Maclisp (1966) which in turn directly descends from Lisp 1.5, the first widely distributed Lisp.
Scheme (1975) started from a clean slate.
Thus, Scheme is a newer design. Again, i'm firmly in the CL camp, but i need to be fair.
>>
>>
>>
>>108996625
His stubbornness is also why the GNU project exists. I’m convinced the concept of free software wouldn’t exist in its current form and wouldn’t have got nearly so far with a less obstinate person since he was fighting issues many other people didn’t see the seriousness of for decades. In many ways RMS and his ideas already won.
CL would have been the better choice for Emacs though definitely
>>
>>108996720
Probably not, but I haven’t seen much vibeslopped Lisp at all, so I don’t know what you’re talking about. I think CL has better features and Elisp unfortunately does make some downright deranged choices like having t being used when keywords would’ve made intent clearer. I do like all Lisps though.
>>
>>
>>108996826
>>108996625
>>108996255
Keep in mind that GNU Emacs started in 1985, when common lisp standard was still in development. ANSI CL standard was released in 1991. And for some time CL implementations weren't as fast as they are today on modern hardware. We're talking the times of lisp machines, when you needed special hardware to run a featureful lisp like CL efficiently. And GNU system was meant to be usable on general purpose computers.
>>
>>108994481
>Is there a way to make orgmode bash run on the actual terminal emulator (vterm or eat)? I think that would be very neat
This is a very rough draft that sends the src block at point to vterm, one line at a time.(defun org-babel-send-to-vterm ()
"Send the src-block at point to vterm one line at a time."
(interactive)
(if-let* ((vterm-buffer (get-buffer "*vterm*"))
(element (org-element-at-point)))
(if (eq (org-element-type element) 'src-block)
(let* ((lines (string-split (org-element-property :value element) "\n")))
(with-current-buffer vterm-buffer
(dolist (line lines)
(vterm-send-string line)
(vterm-send-return))))
(user-error "Not an org src block"))
(user-error "vterm not found or org element not found")))
>>
>>108991284 here. I ended up deleting the elpaca folder and so reinstalling all packages. Elpaca always fails to install/update some 5 or 6 packages with unclear errors, but if you then select them manually and ask it to install them it succeeds. After that, I run into the following curious problem:
Elpaca line from the installer in init.el:(add-hook 'after-init-hook #'elpaca-process-queues)
No packages load, nothing gets set up according to use-package clauses, also, no errors or messages. Change it to:(add-hook 'after-init-hook (lambda () (elpaca-process-queues) (elpaca-process-queues)))
Everything is set up correctly and works. Nani the fuck, elpaca??
>>
>>108999083
elpaca-after-init-hook is broken, probably related https://github.com/progfolio/elpaca/issues/545#issuecomment-4581346868
>>
>>108999113
That does look related. I guess for a package manager there's a lot of weird edge cases that are hard to find since everybody's got a differrent setup. Realistically speaking, I should try to replicate the bugs with a minimal init configutation and report them. But it seems like it would take a lot of time
>>
>>
>>
>>108992458
>https://okmij.org/ftp/Computation/Make-functional.txt
Cool
>>
>>
>>
I'm a bit embarrassed to ask but I'm a nocoder trying Guix, I have two machines (+VM that I test stuff on) and when making my config I got interested in adding machine specific configurations for the three specs in one file.
I was thinking about something like this:(define my-hostname
(cond
((string=? current-machine "vm") "vm")
((string=? current-machine "machine_1") "machine_1")
((string=? current-machine "machine_2") "machine_2")
(else "default-host")))
(define my-grub-resolution
;; i define it here so i can plop my-grub-resolution in the actual grub config
(cond
((string=? current-machine "machine_1") '("1920x1080x32"))
(else '("1360x768x32"))))
(define my-machine-services
(cond
((string=? current-machine "vm")
(list
(service spice-vdagent-service-type)))
((member current-machine '("machine_1" "machine_2"))
(list
(service cups-service-type)
(service bluetooth-service-type
(bluetooth-configuration
(name my-hostname)
(controller-mode 'dual)
(experimental #f)
(multi-profile 'multiple)
(fast-connectable? #t)))
))
((member current-machine '("machine_1" "machine_2" "vm"))
(list
(simple-service 'extend-kernel-module-loader
kernel-module-loader-service-type
(append '("sch_fq_pie" "tcp_bbr" "ntfs3")
(if (string=? current-machine "machine_1")
'("nvidia" "nvidia_modeset" "nvidia_uvm")
'())))))
(else
'())))
This is just a snippet but it represents well what I'm thinking. Is this a stupid idea? Are there more efficient ways of achieving what I want?
>>
>>108980394
Memory fragmentation kills performance. Random state stored all over the place. Also it turns programming into a game of trying to recreate Plato's realm of forms instead of it being just data and things that act on that data.
>>
>>
>>
>>
File: no.jpg (231.0 KB)
>>109000970
https://www.youtube.com/watch?v=8BK7Kt6KcLg
>>
File: htdp-2e-cover.gif (96.2 KB)
Im having second thoughts about learning from Touretzky rather than
>>108967280
>>SICP/HtDP
>>
>>109002507
THE BOOK DOES NOT FUCKING MATTER.
I LEARNED PROGRAMMING BY GOOGLING RANDOM SHIT AND JUST TRYING TO MAKE SHIT WORK.
I REMEMBER WRITING BATCH SCRIPTS IN MIDDLE SCHOOL WITH A BUNCH OF GOTO STATEMENTS, TRYING TO MAKE A TUI FOR A MISSILE LAUNCH PROGRAM THAT WAS PURELY INTENDED TO LOOK BADASS
>>
>>
>>
>>109003302
this is the only one i know of
https://github.com/jonnay/org-beautify-theme
but what i meant in my other post is that themes can also be stuff like
https://cgit.git.savannah.gnu.org/cgit/emacs.git/tree/etc/themes/newco mers-presets-theme.el
>>
>>109003313
I didn't realize themes could set variables like that. I don't know if I like it. (I'm leaning toward "no", but I feel like I ought to give it a fair chance and play with it a bit before I make a judgement.) When I get around to building and running Emacs 31, I'll try this out.
Variable setting mechanism aside, I like the intent of the newcomers-presets theme. I agree with most of the settings I recognize. There are also many settings I don't recognize, but I'm guessing I'll find most of them reasonable.
https://sachachua.com/blog/2026/04/what-s-in-the-emacs-newcomers-prese ts-theme/
>>
>>109003641
I feel like saying it's for "newcomers" is a bit of a misnomer. I think Emacs veterans would appreciate a lot of these settings too. They may even already have many of them set in their own configs.
>>
>>
>>
File: baakubrokenu.png (354.4 KB)
>AND OR
>not gates but syntax sugar for if statements control flow
GUAT DA FAQQING FAQ MANG I AM SPIRITUALLY BUCK BROKEN BY THIS BUDDHA CALCULUS INSANITy
>data is code/code is data
>emptiness is form/form is emptiness
Fucking weedsmoking ass McCarthy smoking weed with the Beatles in Area 51 India
>>
File: 1774571477591002.jpg (105.3 KB)
>>109004348(kill-p 'buddha)
;; -> t
>>
File: syntaxSugar.png (19.4 KB)
>>109004348
here I thought these smart guy hieroglyphs were a greater source of truth than these boring truth tables that the parens foretold me
>>
File: JohnLisp.jpg (137.1 KB)
>>109004367
>electrical wiring diagrams are a high level abstraction
>>
File: DaVinciImacculateConceptionMary.jpg (36.8 KB)
>>109004387
>your mom is a high level abstraction
>>
>>
>>109004387
>there is no higher or lower level abstraction
>no total nor partial ordering of anything
>And Jesus saith unto him, The foxes have holes, and the birds of the air have nests; but the Son of man hath not where to lay his head.
>all is void in the SICPa dharma
>>
File: drMario.png (1.2 MB)
>Gemini:
If you want the visual step-by-step experience Touretzky promised, DrRacket is the only tool that actually delivers it.
When you use the "Stepper" in DrRacket, it actually highlights the specific part of your code it is currently evaluating, and it replaces that code with the result of the calculation. It is the "slow-motion playback" you were looking for
>>
>>
>>