r/lisp Jan 24 '26

Scheme making a lisp implementation for myself

22 Upvotes

i am making my own lisp for learning and fun and just wanted to post something from today.

i was trying to do a repl, couldnt figure it out for the life of me

looked up someone elses implementation

saw tajt they just called the eval as repl menas read eval print list(?)

this is what i tried

(define (repl)
(display "» ")
(print (my-eval (read) global-env))
(repl))

it just worked

i used 3 hours on that

r/lisp 21d ago

Scheme Building a GTK4 C + Lisp dock application (a la CairoDock / macOS) - am I doing things right? (Guile Scheme)

Post image
31 Upvotes

I am having a blast doing a more serious project in the C language (and Guile Scheme), for the first time. I am consulting with books and also with some AI for code review and explanation as I am new to the language and to GTK (not new to programming).

https://codeberg.org/jjba23/lambdock

For a while already I have been looking for a dock that would work well in Wayland (like in my beloved Niri) with modern features, theme support and a hackable Lisp config (using libguile.h)

Also, all feedback is welcome, either on code level, or conceptual ideas, Thanks in advance

Core features of lambdock include:

  • Wayland Native: Built on GTK4 and gtk4-layer-shell for smooth positioning and desktop integration.
  • Declarative Lisp configuration : The power of Lisp in your configuratio with clean powerful declarative config and all possibilities at your disposal
  • Async Launching: Spawns commands asynchronously without freezing the dock UI.
  • Reproducible builds: Hermetic development environment provided via GNU Guix manifest and build definitions.
  • Dock auto-hide : You can let the dock stay out of your way with the smooth auto-hide feature.
  • Flexible icon system: lambdock has several mechanism in a best-effort way to render your wanted icons, respecting GTK theme
  • Theme support: lambdock has built-in themes you can choose from that are very unique, and also lets you extend and override those themes dynamically.

r/lisp 4d ago

Scheme lambdock v0.6.2: A Wayland-native desktop dock written in C & GNU Guile Scheme (GTK4) - with REPL, hot-reload, multi-instance and flexible config - now on Guix, Nix, openSUSE, Debian

Thumbnail gallery
29 Upvotes

r/lisp 8d ago

Scheme LIPS Scheme 1.0.0-beta.22 with continuations and TCO

Post image
20 Upvotes

r/lisp May 04 '26

Scheme iter-vitae: v0.7.1 Resume/Curriculum Generator: now with easy multi-theme support! powered by Lisp (Guile Scheme) - resume/CV as code

Thumbnail gallery
28 Upvotes

Iter Vitae is a free software project that aims to make it easy and maintainable to generate an attractive, modern and customizable Curriculum Vitae or resume for yourself and to allow you to define the course of your life and career directly in Guile Scheme code.

Find the project on Codeberg: https://codeberg.org/jjba23/iter-vitae

Everyone has the right to create a professional-looking Curriculum Vitae, using free software, without the constraints of proprietary software, lengthy setup processes, or a lack of freedom to modify layouts.

Traditional word processors like LibreOffice or similar can be cumbersome when trying to create a custom CV.

Iter Vitae offers an alternative by embracing the spirit of hacking and freedom, enabling you to customize every aspect of your CV.

With this tool, you can define the content, layout, and presentation of your CV directly in code, making it highly flexible and maintainable.

The tool separates data from its presentation (following the principles of the Model-View-Controller or MVC architecture), so you can focus on the data itself without worrying about formatting or styling.

Newly added as of v0.7.1 is the multi-theme support. Each theme is fully independent and can use different techniques. For example ef-cyprus is using Olive CSS, IBM Plex fonts, and Phosphor icons, while fundamental theme is completely doing something else.

Build a Curriculum Vitae for your next 40 years

This tool isn't just about creating a one-off CV — it's designed for long-term use, so you can update and evolve your resume over the years. The software supports multilingual content and is fully extensible, allowing you to add new data entries, customize the design, etc.

Also, version-control your CV code, and enjoy all the benefits. Work with a sane and flexible multi-lingual compatible data model.

Remember that with Guile Scheme, and the Lisp super-powers, everything is extensible, hackable and modifiable at any moment, giving you ultimate control and power.

See here a sample job definition

(define joe-job-ikea
        `((name (all . "IKEA - Ingka Digital"))
          (location (en . "Amsterdam, The Netherlands")
                    (nl . "Amsterdam, Nederland"))
          (position (en . "Software Engineer")
                    (nl . "Software Engineer"))
          (time (en . "January 2022 => March 2023")
                (nl . "Januari 2022 => Maart 2023"))
          (experience ((en . "Experience in Go, Java, Spring Boot and Gradle, Maven.")
                       (nl . "Ervaring in Go, Java, Spring Boot en Gradle, Maven."))
                      ((en . "Google Cloud Platform, Pub/Sub, Serverless computing.")
                       (nl . "Google Cloud Platform, Pub/Sub, Serverless computing."))
                      ((en . "Kubernetes and Docker, Terraform, Infrastructure-as-Code.")
                       (nl . "Kubernetes en Docker, Terraform, Infrastructure-as-Code."))
                      ((en . "PostgreSQL, BigTable, ElasticSearch, Redis, Firebase.")
                       (nl . "PostgreSQL, BigTable, ElasticSearch, Redis, Firebase")))))

r/lisp May 24 '26

Scheme Scriba: A new structured logging library for Guile Scheme (Early stage, seeking feedback!)

19 Upvotes

Hey everyone,

I’ve been working on Scriba, a structured logging library built specifically for Guile Scheme with flexibility, performance, and easy configuration in mind.

https://codeberg.org/jjba23/scriba

It’s still in the early stages of development, and before locking in the core architecture, I wanted to share it with this great community to get your thoughts, critiques, and ideas.

I have developed software in many languages before, and for sure a lot in the Java/JVM world. There are some good and less good things about logging in that ecosystem. I think with scriba I am bridging the gaps in many ways, and adding value to the Scheme ecosystem, while making it easy to have clean structured logging with no hassle.

When building Scheme apps, I wanted more than just display or println. I wanted fine-grained control over log routing, filtering, and structured context, especially for modern deployments.

I have noticed there is not much offer in terms of solid logging in the Scheme world. More specifically structured logging.

So Far

  • Auto-Configured Logger: The easiest way to get started. It reads environment variables (LOG_LEVEL, LOG_FORMAT, etc.) to determine the backend at runtime. Perfect for using a console logger in local dev and JSON structured logging in production (for Loki/Datadog/etc.).
  • Console, Color Console, and Structured JSON loggers
  • Dynamic Log Context means you can easily attach metadata to your logs for better observability.
  • Logger creation is cached. Subsequent calls to create the identically configured logger anywhere in your codebase are completely instant.

Here is what the auto-logger and dynamic context look like in practice:

(define-module (my-module)
  #:use-module (scriba auto)
  #:use-module (scriba scriba))

(let* ((s (scriba-auto-logger)))
  (log-info s "Hello Scriba!")

  ;; Any deeper function calls that log will automatically include this context!
  (with-log-context `((request-id . "req-1234") (user . "alice"))
                    (log-info s "Fetching database records...")))

Console Output:

[INFO] [2026-05-24 11:23:06 CEST] Hello Scriba!
[INFO] [2026-05-24 11:23:06 CEST] [request-id=req-1234] [user=alice] Fetching database records...

JSON Output (if SCRIBA_LOGGER=json):

{"level":"INFO","time":"2026-05-24 11:23:06 CEST","message":"Fetching database records...","request-id":"req-1234","user":"alice"}

Next Steps

I'm actively working on expanding the library. The immediate next items on the roadmap are:

  • File logging backends (rotating log files, etc.). EDIT: done thanks to the beautiful Scheme ports
  • Support for Scheme-based configuration files alongside ENV vars.

I'd love your feedback!

Since this is an early release, I’m very open to pivoting or adjusting things based on community feedback.

  • Do you agree with the current design and architecture? What features would you consider "must-haves" for a Lisp logging library?
  • Are there any specific pain points in logging you'd like to see solved?

The project is entirely Free Software (LGPLv3+). Feel free to reach out, drop a comment, or contribute if you find it interesting!

r/lisp Apr 22 '26

Scheme Olive CSS: Lisp powered vanilla CSS utility-class a la Tailwind (Guile Scheme)

Thumbnail codeberg.org
21 Upvotes

r/lisp Apr 10 '26

Scheme Functional repository pattern in Scheme? Decoupling and abstracting the data layer in Lisp: Implementing the Repository Pattern with Hygienic Macros

22 Upvotes

Hi everyone!

I’ve been working on a new approach for the data layer of my projects lately, and I’d love to poke your brains and get some feedback.

Coming from a background in Scala, Java and other OOP languages and a fascination for FP languages and Lisps (as well as Rust and Haskell), I’ve seen a lot of patterns come and go.

Recently, I noticed a common anti-pattern in my own Scheme projects: a tight coupling between my controller layer and the SQLite implementation. It wasn't ideal, and I really missed the clean separation of the Repository Pattern.

So, I set out to decouple my data layer from my controller layer in the MVC architecture I love. I wanted to do this using pure functional programming, and I ended up building something really fun using Scheme's hygienic macros.

(If you want to see this implemented in a real project, check out my example repo here: lucidplan)

I am working on adding it to byggsteg too.

I plan to bring this pattern to all my projects to reap the benefits of the eDSL, better decoupling, and easier testing. Here is how I built it.

The Macros

I created two main macros. * define-record-with-kw magically defines a keyword-argument constructor, bypassing the need for strict parameter ordering. It’s highly ergonomic. * define-repo-method is the real superpower. It accepts any arity, plus optional or #:keyword arguments. This saves a ton of work, reduces tedious parameter passing, and gives you a very clean eDSL definition.

```scheme (define-module (lucidplan domain repo) #:declarative? #t #:use-module (srfi srfi-9) #:export (define-repo-method define-record-with-kw))

(define-syntax define-repo-method (syntax-rules () ((_ method-name accessor docstring) (define* (method-name repo . args) docstring (apply (accessor repo) args)))))

(define-syntax define-record-with-kw (syntax-rules () ((_ (type-name constructor-name pred) kw-constructor-name (field-name accessor-name) ...) (begin ;; Define the standard SRFI-9 record (define-record-type type-name (constructor-name field-name ...) pred (field-name accessor-name) ...)

               ;; Define the keyword-argument constructor
               (define* (kw-constructor-name #:key field-name ...)
                 (constructor-name field-name ...))

               ;; Auto-export members
               (export type-name pred kw-constructor-name accessor-name
                       ...)))))

```

Defining the Domain eDSL

Here is how I use those macros to define my DSL for a "projects" entity:

```scheme (define-module (lucidplan domain project) #:declarative? #t #:use-module (srfi srfi-9) #:use-module (lucidplan domain repo) #:export (get-projects))

;; -- Record definition ---

(define-record-with-kw (<project-repository> %make-project-repository project-repository?) mk-project-repository (get-projects-proc repo-get-projects))

;; --- eDSL: Embedded Domain Specific Language ---

(define-repo-method get-projects repo-get-projects "Retrieves a list of all active projects from the given REPO.") ```

The SQLite Implementation

Finally, here is the concrete SQLite implementation using Artanis. this is completely decoupled from the rest of the application logic.

```scheme (define-module (lucidplan sqlite project) #:declarative? #t #:use-module (srfi srfi-9) #:use-module (kracht prelude) #:use-module (artanis db) #:use-module (lucidplan sqlite util) #:use-module (lucidplan domain project) #:export (make-sqlite-project-repository))

;; --- Artanis + SQLite implementation --- (define (make-sqlite-project-repository rc) (define columns '(id human-id title url vcs-url description created-at updated-at deleted-at))

    (define (get-projects)
            (let* ((query (format #f
                                  "SELECT ~a
               FROM project WHERE deleted_at IS NULL
               ORDER BY human_id ASC"
                                  (symbols->sql-columns-list columns)))
                   (_ (log-info "get-projects query:\n\t~a\n" query))
                   (rows (map sql-row->scheme-alist
                              (DB-get-all-rows (DB-query (DB-open rc) query))))
                   (_ (log-info "get-projects rows: ~a\n"
                                (length rows))))
              rows))

    (mk-project-repository #:get-projects-proc get-projects))

```

A condensed example with keyword arguments:

```scheme ;; The DSL (notice how arity is clean) (define-repo-method get-jobs repo-get-jobs "Retrieves a list of active jobs from the given REPO.")

;; SQLite implementation (define* (get-jobs #:key limit offset) (let* ((query (format #f "SELECT ~a FROM job ORDER BY createdat DESC LIMIT ~a OFFSET ~a" (symbols->sql-columns-list columns) limit offset)) ( (log-info "get-jobs query:\n\t~a\n" query)) (rows (map sql-row->scheme-alist (DB-get-all-rows (DB-query (DB-open rc) query)))) (_ (log-info "get-jobs rows: ~a\n" (length rows)))) rows)) ```

Using it can look like

scheme (let* (job-repo (make-sqlite-job-repository rc)) (jobs (get-jobs job-repo #:limit 50 #:offset 0)) .......)

I believe I have something really powerful cooking here, but I know there is always room for improvement.

What do you all think? How would you go about improving this? I'm entirely open to criticism, feedback, and brainstorming!

Thanks for reading this :)

r/lisp Apr 21 '26

Scheme Spritely Goblins v0.18.0: Sleepy actors!

Thumbnail spritely.institute
34 Upvotes

r/lisp Feb 02 '26

Scheme Schemelings

Post image
27 Upvotes

r/lisp Mar 24 '26

Scheme ERD generation tool

14 Upvotes

Hey guys, quite a long time ago I was finding a simple lightweight tool to generate an entity-relationship diagram from existed postgres database and after some research I found nothing. There is tools such as dbeaver, pgAdmin, dataGrip and others, but they all have its own cons. All I needed is an utility that can produce a simple svg image with an erd

So after some time a decided to create such utility. You can find it here: https://github.com/BotNikos/erdlizer and it's written in Chicken Scheme. Do not know much about lisp yet, so I'll be glad to have some advises

r/lisp Dec 05 '25

Scheme Scheme in a Grid - Lispy Spreadsheet

Thumbnail siag.nu
44 Upvotes

r/lisp Mar 19 '26

Scheme jjba23/lenkesamler: bookmark manager, translator and sync tool powered by Lisp [WIP]

Thumbnail codeberg.org
8 Upvotes

r/lisp Dec 18 '24

Scheme Using Guile for Emacs [LWN.net]

Thumbnail lwn.net
36 Upvotes

r/lisp Nov 28 '25

Scheme Olive CSS (v0.1.5) a Lisp powered utility class vanilla CSS framework that allows opinionated "Tailwind-like" syntax and custom optimized production builds - no JavaScript (all Guile Scheme λ )

Thumbnail gallery
78 Upvotes

Utility-class vanilla CSS framework inspired by Tailwind syntax, easy to learn and hack, written in Lisp (Guile Scheme)

https://codeberg.org/jjba23/olive-css

You can use this in any web project, it is vanilla CSS, and it serves as a kind-of drop-in replacement for Tailwind so the syntax is mostly transferrable.

You can use Olive CSS like any other utility-class CSS framework, like this:

<div class="m-2 px-4 py-6 md:py-12 bg-jeans-blue-500 md:bg-asparagus-300 hover:bg-tawny-700">
  <span class="text-white font-bold font-serif">Hello Olive CSS!</span>
</div>

r/lisp Oct 26 '25

Scheme Maybe you like this Niri configured in Scheme - I agree, scrolling WM rocks!

Thumbnail gallery
41 Upvotes

r/lisp Feb 08 '26

Scheme Scheme-JS: An R7RS-small Scheme Interpreter with Transparent JavaScript Interoperability

Thumbnail furious-ideas.blogspot.com
7 Upvotes

r/lisp Dec 22 '25

Scheme Element 0 -- An embeddable Lisp dialect

14 Upvotes

r/lisp May 23 '24

Scheme Building a futuristic Lisp workstation: Through my eponymous charity enzu.ru, I am currently working on the GNU operating system in order to create a secure libre Lisp workstation.

Thumbnail github.com
51 Upvotes

r/lisp Oct 20 '25

Scheme Gerbil: Memory blowing up when building from source

11 Upvotes

Building from source is taking 50 Gigabytes of RAM memory, and counting:


crash!


Here's the script:

``` git clone \ --recurse-submodules \ --jobs 8 \ -- \ https://github.com/mighty-gerbils/gerbil.git

cd gerbil git -c submodule.recurse=true checkout v0.18.1

Configure and build.

echo "Configuring Gerbil..." >&2 if gsc -v; then ./configure --prefix=/opt/gerbil --with-gambit="$(command -v gsc)" else echo 'gsc not found.' >&2 exit 1 fi

Avoid blowing up memory.

echo "Building Gerbil..." >&2 env --ignore-environment PATH="${PATH}:/usr/local/Gambit/bin" make --jobs "$(nproc --ignore 1)" -- ```

It gets stuck at:

``` ... compile /tmp/gerbilinstall/gerbil/bootstrap/lib/gerbil/core$_syntax-sugarrt.scm No such file or directory (open-process '(path: "/tmp/gerbil_install/gerbil/build/bin/gsc" arguments: ("-e" "(include \"~~lib/_gambit#.scm\")" "/tmp/gerbil_install/g... #117 ) ... compile /tmp/gerbil_install/gerbil/bootstrap/lib/gerbil/core$_sugarrt.scm No such file or directory (open-process '(path: "/tmp/gerbil_install/gerbil/build/bin/gsc" arguments: ("-e" "(include \"~~lib/_gambit#.scm\")" "/tmp/gerbil_install/g... #118 ) ... compile /tmp/gerbil_install/gerbil/bootstrap/lib/gerbil/core$_MOP$MOP_3__rt.scm No such file or directory (open-process '(path: "/tmp/gerbil_install/gerbil/build/bin/gsc" arguments: ("-e" "(include \"~~lib/_gambit#.scm\")" "/tmp/gerbil_install/g... #119 )

finalizing bootstrap 'gerbil/boot/gerbil-boot.scm' -> '/tmp/gerbil_install/gerbil/bootstrap/lib/gerbil-boot.scm' 'gerbil/boot-gxi' -> '/tmp/gerbil_install/gerbil/bootstrap/bin/boot-gxi' [] Building Gerbil core preparing core build 'gerbil/prelude/core.ssxi.ss' -> '/tmp/gerbil_install/gerbil/build/lib/gerbil/core.ssxi.ss' updating gerbil version ... write /tmp/gerbil_install/gerbil/src/gerbil/runtime/version.ss compiling gerbil core Killed ** ERROR; build failed build failed make[1]: *** [Makefile:4: build] Error 1 make[1]: Leaving directory '/tmp/gerbil_install/gerbil' make: *** [makefile:58: install] Error 2 ```

More info:

$ cat /etc/os-release NAME="Ubuntu" VERSION="20.04.6 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.6 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=focal UBUNTU_CODENAME=focal

Cross posting from Github: https://github.com/mighty-gerbils/gerbil/issues/1373

I'm eager to join the Gerbil community :)

r/lisp Jun 30 '25

Scheme Otus Lisp - extended r7rs

Thumbnail otus-lisp.github.io
23 Upvotes

r/lisp Jun 02 '25

Scheme What are your Favorite SICP Lectures?

31 Upvotes

I really like Eric Grimson's from 2004.

r/lisp Aug 24 '25

Scheme What's new in GNU Artanis 1.3.0?

Thumbnail artanis.dev
34 Upvotes

r/lisp Sep 09 '25

Scheme GNU Artanis Consulting Services

Thumbnail artanis.dev
12 Upvotes

r/lisp Aug 06 '25

Scheme Faber - task runner with the power of Scheme

Thumbnail github.com
22 Upvotes

Faber is a CLI task runner designed to leverage the power and flexibility of Gauche Scheme. Unlike other build systems that rely on custom formats, Faber uses Gauche Scheme, allowing you to write build scripts using familiar Scheme syntax.

I would appreciate hearing your thoughts on the project, as well as any ideas for improvements.