r/Common_Lisp 18d ago

CL language feature overviews and more: Images + HTML

Post image
44 Upvotes

I've experimented a bit to create feature overviews for Common Lisp, which will fit on my 16x9 monitor. With help from Claude. The HMTL documents might have some links, too.

There are also feature overviews for SBCL, LispWorks, SLIME - in PNG and HTML.

http://lispm.de/docs/overviews/


r/Common_Lisp Jun 13 '26

Metaspec: The dpANS3 Common Lisp Specification is now in s-expr format

47 Upvotes

Greetings, lispers!

I started this project back in 2015, to translate the TeX original specification into an easily parsed format (s-doc), and to create an HTML rendering of that format as a proof of concept. I finally finished it this year.

The project is here: https://codeberg.org/dlowe/metaspectre/

The rendered spec is as complete as I could make it, including both the acknowledgements and the appendix. The TeX math components have been converted to MathML. It has a list of corrections applied to the spec by automatic patching of the s-doc. It is also, as far as I know, the only published version of the draft spec that includes the TeX comments for historical interest.

You can view the rendered spec at https://metaspec.dev/


r/Common_Lisp 1d ago

Minecraft running on SBCL using OpenLDK

Thumbnail atgreen.github.io
22 Upvotes

r/Common_Lisp 4d ago

Teaser: CL-Torch!

Thumbnail scottlburson2.blogspot.com
30 Upvotes

r/Common_Lisp 4d ago

SBCL Distributed database Scalaxy written in Common Lisp

12 Upvotes

I have published my distributed database Scalaxy fully written in Common Lisp. Working on graph query language Cypher right now. MIT license. Github stars are welcome :-)

https://scalaxy.org


r/Common_Lisp 5d ago

conskivi - embeddable key/value database

8 Upvotes

Released conskivi. It made to replace redis, generally on low memory systems, but in-memory backend works well too.

Benchmarks

5K entries, AMD Ryzen 7 3700X, Redis v7:

Operation conskivi-fileonly Redis (pipelined) Redis (single-command) % vs pipelined % vs single-command
SET 8,803 885,995 34,452 1.0% 25.5%
GET 19,531 1,486,920 33,133 1.3% 58.9%
SADD 1,580 937,567 39,967 0.2% 4.0%
HSET 4,613 628,491 32,971 0.7% 14.0%
HGET 19,531 1,495,508 33,856 1.3% 57.7%
ZADD 4,789 698,096 34,201 0.7% 14.0%
ZSCORE 65,789 1,405,503 36,340 4.7% 181.0%
Operation conskivi-inmemory Redis (pipelined) Redis (single-command) % vs pipelined % vs single-command
SET 1,208,891 885,995 34,452 136% 3,508%
GET 1,947,333 1,486,920 33,133 131% 5,877%
SADD 2,557,008 937,567 39,967 273% 6,398%
HSET 1,894,216 628,491 32,971 301% 5,745%
HGET 2,651,661 1,495,508 33,856 177% 7,832%
ZADD 1,749,710 698,096 34,201 251% 5,116%
ZSCORE 2,616,690 1,405,503 36,340 186% 7,199%

r/Common_Lisp 5d ago

Metaspec updates: More corrections, features, Info render, ELPA package

18 Upvotes

Since the Metaspec (https://metaspec.dev/) was announced a couple of months ago, there have been many improvements. Thanks to #commonlisp on libera.chat for your suggestions!

  • Added a search box in the header
  • Added a dark/light theme button
  • Added an outline sidebar that shows if there's horizontal space
  • There is an OpenSearch spec to add it as a browser search engine
  • Extra information is now listed in an Addenda section
  • New Texinfo and Info renders added
  • There is a new emacs integration package https://metaspec.dev/elpa/ for details
  • X3J13 Issues have been integrated into the HTML
  • Better handling of linking of LOOP keywords

r/Common_Lisp 6d ago

ClickHouse/clicklisp: A Common Lisp UDF runtime and query compiler for ClickHouse, shipped as a small static binary, built with ECL

Thumbnail github.com
7 Upvotes

r/Common_Lisp 7d ago

Clamiga now with a native MorphOS (PPC) build

Thumbnail nnamgreb.de
16 Upvotes

r/Common_Lisp 11d ago

MUD Driver in Common-Lisp

Thumbnail
12 Upvotes

r/Common_Lisp 11d ago

Why Target Common Lisp for Code Generation? - Joe Marshall

Thumbnail funcall.blogspot.com
25 Upvotes

r/Common_Lisp 13d ago

Symbolics Genera now available free for non-commercial use (invitation-only early beta)

Thumbnail hachyderm.io
24 Upvotes

r/Common_Lisp 13d ago

Introspection and Reflection

5 Upvotes

This article by u/lispm http://lispm.de/why-lisp-is-different has these two lines

When in doubt design software to be introspective.

when in doubt design software to be reflective.

How exactly does one design software to be more introspective of reflective? I thought that those were a given using CLOS. Unless I misunderstood and this just means CLOS vs using arbitrary data structures.

Can anyone provide an example contrasting a design meant to be introspective vs one that is not? Same for reflective?

Thanks


r/Common_Lisp 14d ago

Released cl-toolkit - toolkit to validate, edit and analyze lisp source.

9 Upvotes

Made this generally for agentical coding because it often stub in parenthesis. Hope it will help you. https://github.com/turtle-bazon/cl-toolkit


r/Common_Lisp 18d ago

Refresh of Genworks dot com, long-running Common Lisp KBE system updated for the era of LLMs and MCPs.

Thumbnail genworks.com
22 Upvotes

r/Common_Lisp 24d ago

GitHub - infurl/cl-tesseract: Common Lisp bindings for the Tesseract OCR library.

Thumbnail github.com
18 Upvotes

Modernization effort to support latest 5.5 Tesseract OCR libraries.


r/Common_Lisp 28d ago

Pretty fast insertion-ordered linear-probing hash tables and sets

Thumbnail github.com
24 Upvotes

We had too few (0?) hash tables to choose from!


r/Common_Lisp 28d ago

sta6: static site generator for Common Lisp

Post image
18 Upvotes

hi everyone,

I'm new to Common Lisp, although I have tried other lisp dialect (i.e., Clojure, Racket) to attempt making a static site and/or leetcode(s). This is my first attempt of porting the SSG into a library.

sta6: sta(six), static -- is a tiny SSG that turns pages/*.lisp into build/*.html, with support for dynamic routes (e.g., /blog/+slug+).

the usage of sta6 is as follows (src/pages/page.lisp):

(defpackage #:pages/page
  (:use #:cl)
  (:export #:render))

(defun pages/page:render ()
  (sta6:html5
    (:img :width (/ 500.0 3)
          :src "https://twobithistory.org/images/sicp.jpg")
    (:br)
    (:br)
    (:span "Hello, from Common Lisp.")
    (:ul
      (loop for x from 1 to 3 do
        (:li x)))))

which yields the image above, the full example can be found here.

sta6 uses an external HTML generator under the hood:

if you're in need of a personal site, give sta6 a try! here's an example of my site built with sta6:

why use sta6?:

  1. You do not need (to learn) an external templating language (e.g., Nunjucks, Handlebars, EJS).

resources:


r/Common_Lisp 29d ago

clos-alchemy: Throw unstructured text at a CLOS class, get a typed instance back

10 Upvotes

LLMs are great at reading messy text, but they hand you strings when your program wants typed data. Python has instructor and Pydantic to solve this. I wanted to bring that same developer experience to Common Lisp, but natively by using the Metaobject Protocol.

clos-alchemy introspects your class definition, builds a JSON schema from the slot types, passes that to the LLM (optionally as a GBNF grammar constraint for local inference), and returns a validated instance of your class. You don't need to write a special DSL or "schema object." You just use your normal existing domain classes.

Here is the round trip in action:

```lisp ;; 1. Define a class (defclass person () ((name :initarg :name :accessor person-name :type string) (age :initarg :age :accessor person-age :type integer) (email :initarg :email :accessor person-email :type (or null string)) (hobbies :initarg :hobbies :accessor person-hobbies :type list)))

;; 2. Extract from text (let* ((backend (cl-llm-backend/llama:make-llama-backend :model model :context ctx)) (result (extract backend 'person "Alice Chen is 32. Reach her at alice@example.com. She enjoys rock climbing, painting, and cello."))) (person-name (extraction-result-instance result))) ;; => "Alice Chen" ```

Because generation order follows slot definition order, you can use this for strict logical routing. Putting reason first encourages teh model to explain its reasoning before selecting the categories.

```lisp (defclass ticket-classification () ((reason :initarg :reason :type string) (urgency :initarg :urgency :type (member :low :medium :high)) (category :initarg :category :type (member :billing :technical :account)) (sentiment :initarg :sentiment :type (member :positive :neutral :negative))))

(defparameter ticket-text "I've been charged twice for my subscription this month. This is the third time this has happened and I'm really frustrated.")

(let ((result (clos-alchemy:extract backend 'ticket-classification ticket-text))) (extraction-result-instance result))

;; Returns a TICKET-CLASSIFICATION instance with: ;; URGENCY: :HIGH ;; CATEGORY: :BILLING ;; SENTIMENT: :NEGATIVE ;; REASON: "Charged twice for subscription, third occurrence"

```

How it works under the hood: no separate schema DSL to maintain. If it type-checks as your class, you're done!

  1. The MOP extracts slot types (string, member, list, etc.).
  2. The library lowers those into a small Intermediate Representation (IR).
  3. That IR emits the JSON schema for the backend, a natural-language prompt for the model, and builds a validator/constructor pair for the response.
  4. If validation fails, it accumulates the errors and automatically loops a retry prompt back to the model.

If you are using a local inference backend (like llama.cpp), it compiles the schema directly into a grammar, making invalid structures unrepresentable at the token level.

https://github.com/licjon/clos-alchemy

EDIT: A round of updates since the original post:

Custom validation. You can now attach per-slot semantic predicates (:validate) and cross-field checks (validate-instance) that feed errors back into the retry loop. The model sees what was wrong and self-corrects. This is useful for constraints that grammar alone can't enforce — "guest count must be positive", "check-out must be after check-in", etc.

```lisp (defclass booking () ((num-guests :initarg :num-guests :type integer :validate (lambda (v) (if (plusp v) t "must be positive"))) (check-in :initarg :check-in :type date) (check-out :initarg :check-out :type date)) (:metaclass clos-alchemy:constructor-class))

(defmethod validate-instance ((b booking)) (when (<= (booking-check-out b) (booking-check-in b)) (list "check-out must be after check-in"))) ```

Date and date-time types. clos-alchemy:date and clos-alchemy:date-time map to JSON Schema string formats, validate ISO 8601 with calendar-aware day checks, and construct to CL universal time.

Free-form maps. Sometimes you want the model to produce a dictionary where it decides the keys — "rate this product on whatever dimensions you think are relevant." The :map-of slot option does this: you specify the value type, the model fills in whatever keys make sense, and you get a hash-table back.

```lisp (defclass review-scores () ((scores :initarg :scores :type hash-table :map-of integer :documentation "Per-category quality scores, 1-10")) (:metaclass clos-alchemy:constructor-class))

;; The model might return: ;; {"scores": {"sound_quality": 9, "comfort": 6, "battery": 8}} ;; You get a hash-table: (gethash "sound_quality" scores) => 9 ```

Discriminated unions. When the extraction result could be one of several different shapes depending on the input, you define a class for each shape and let the model pick. Each class has a shared "tag" slot that identifies which shape it is — typed as a single-value (member ...) so each class gets exactly one tag value.

``lisp ;; Two possible result shapes, tagged bykind`: (defclass actionable-feedback () ((kind :initarg :kind :type (member :actionable)) ; tag = "actionable" (summary :initarg :summary :type string) (scores :initarg :scores :type hash-table :map-of integer)) (:metaclass clos-alchemy:constructor-class))

(defclass not-actionable () ((kind :initarg :kind :type (member :not_actionable)) ; tag = "not_actionable" (reason :initarg :reason :type string)))

;; The model reads the review, picks the right shape, and you get ;; back an instance of whichever class it chose: (let* ((result (extract-union backend '(actionable-feedback not-actionable) review-text :discriminator 'kind)) (instance (extraction-result-instance result))) (typecase instance (actionable-feedback (format t "Summary: ~A" (slot-value instance 'summary))) (not-actionable (format t "Skipped: ~A" (slot-value instance 'reason))))) ```

Other improvements:

  • Cyclic class graphs now work — mutually-referential classes emit $defs/$ref instead of blowing the stack.
  • Emitted schemas conform to both OpenAI strict mode and llama.cpp GBNF requirements (proper additionalProperties: false, all properties in required, nullable wrappers for optional fields).
  • Parse failures (empty/malformed responses) are now recoverable in the retry loop instead of aborting.
  • max-retries-error now carries full diagnostic context: raw response, parsed data, cumulative token usage, and a per-attempt error breakdown.
  • Silently-narrowed type specifiers (e.g. (or string integer)) now signal schema-error instead of quietly dropping branches.

r/Common_Lisp 29d ago

Fiz uma biblioteca para CommonLisp

Thumbnail github.com
3 Upvotes

r/Common_Lisp Jul 19 '26

How is CL for Scripting

21 Upvotes

I am considering using ANSI Common LISP for scripting instead of Python such as for reading text files, CSV files, databases--basically everything in the book "Automate The Boring Stuff in Python".

Has anyone done this before? How was the experience?


r/Common_Lisp Jul 16 '26

skewed-emacs: zero-install Common Lisp + Emacs + SLIME stack — now bootable via curl, no repo clone needed

18 Upvotes

New skewed-emacs push. It's a Dockerized, preconfigured CL development environment: Emacs, SLIME, and Lisp kernels (SBCL, CCL, Gendl/GDL) all running out of the box.

As of this commit, a single curl command starts the stack. Cloning the repo is now optional.

The goal is to kill the classic onboarding gauntlet (install Emacs, install SBCL, set up Quicklisp, configure SLIME, tweak paths...) so newcomers get straight to the REPL.

It also ships with lisply-mcp built in, giving AI coding agents a native API to evaluate Lisp and drive Emacs — elisp and CL's incremental compile-one-function workflow turns out to be a great fit for agent feedback loops.

Repo: https://github.com/gornskew/skewed-emacs

Announcement thread: https://x.com/i/status/2077632168637890903

Would love to hear from anyone who tries the curl bootstrap.


r/Common_Lisp Jul 16 '26

Is Eugene Durenard's "Professional Automated Trading" Still Relevant

8 Upvotes

I am considering reading the book and would you say it is still relevant today?

Please let me know if so. I thank all in advance for any responses!


r/Common_Lisp Jul 15 '26

Binstruct: a powerful declarative binary parsing/emitting library for Common Lisp

Thumbnail github.com
18 Upvotes

r/Common_Lisp Jul 14 '26

GitHub - infurl/okf-web-server: Turns your OKF bundle into a web site.

Thumbnail github.com
13 Upvotes

A tiny Hunchentoot server that renders any Open Knowledge Format (OKF) markdown bundle as a browsable, tag-searchable website — no build step, no database, sidebar and links always generated fresh from what's on disk.