EELisp

A Lisp interpreter for personal data management. Database, agenda, and automation — all in one language.

Inspired by dBASE III and Lotus Agenda. Built in pure Swift with SQLite.

Get Started Read the Manual

Everything you need, nothing you don't

A complete Lisp with 80+ builtins, 17 data types, macros, and a SQLite-backed persistence layer.

λ

Full Lisp Language

First-class functions, closures, macros, quasiquoting, pattern matching. Lexical scoping with a prelude of utility functions like pipe, partial, compose.

🗄

Database Engine

Define typed tables, insert records, query with SQL-like filters, update, delete. Interactive browse and edit views. Calculator forms with defform.

📋

Agenda System

Items, hierarchical categories, auto-categorization rules, saved views, smart NLP input, recurring items, templates, and multiple agendas.

📝

EEditor Integration

Runs embedded inside EEditor — a native editor for macOS, iOS, and iPadOS. The REPL, calendar, and forms all live inside the editor.

🌐

HTTP & JSON

Built-in HTTP client (http-get, http-post) and JSON parser. Connect to APIs, fetch data, and process it all in Lisp.

📁

File & Clipboard

Read, write, and list files. Get and set clipboard contents. Sandboxed file access for safety. Automate text workflows.

Database — dBASE III, reimagined

Typed tables, CRUD operations, interactive forms, and SQL-like queries.

Define & Query
;; Create a typed table
(deftable contacts
  (name:string email:string age:number active:bool))

;; Insert records
(insert contacts
  {:name "Alice" :email "alice@co.com" :age 30})

;; Query with filters
(query contacts
  :where "age > ?"
  :params (list 25)
  :order "name")
Interactive Forms
;; Calculator form with computed fields
(defform loan-calc
  (principal:number rate:number years:number)
  :computed
  ((monthly-rate  (/ rate 1200))
   (num-payments   (* years 12))
   (monthly-payment
     (* principal
       (/ (* monthly-rate
             (pow (+ 1 monthly-rate) num-payments))
          (- (pow (+ 1 monthly-rate) num-payments)
             1))))))

;; Choice fields & table-backed forms
(defform ticket
  (title:string
   (priority:choice "High" "Medium" "Low"))
  :source tickets)

Agenda — Lotus Agenda, reborn

A powerful personal information manager with categories, rules, views, and natural language input.

Smart Input & Categories
;; Natural language — auto-parses dates, priority, people
(add "Meet Alice tomorrow for coffee !!")
;; → when: tomorrow, priority: 2, who: Alice

(add "URGENT fix server crash")
;; → priority: 1

;; Hierarchical categories
(defcategory work/projects)
(defcategory priority
  :exclusive true
  :children (high medium low))

;; Auto-categorization rules
(defrule urgent-flag
  :when (str-contains text "URGENT")
  :assign "priority/high")
Views, Recurring & Templates
;; Saved views — dynamic perspectives on your data
(defview overdue
  :source items
  :filter (overdue?)
  :sort-by when)

(defview inbox
  :source items
  :filter (= (length categories) 0))

;; Recurring items
(add-item "Team standup"
  :when "2026-02-24" :recur :weekly)

;; Templates
(deftemplate weekly-review
  :text "Reflect on goals"
  :category "work"
  :priority 2)

(from-template weekly-review
  :when "2026-03-14")

Powered by EEditor

EELisp runs standalone or embedded inside EEditor — a fast, native editor for Apple platforms.

  • Native App — macOS 14+, iOS 17+, iPadOS 17+
  • Built-in REPL — EELisp terminal tab with full SQLite database
  • Calendar Sidebar — Month grid with activity dots, daily notes
  • Multi-tab Editor — Syntax highlighting for 24+ languages
  • Interactive Viewsbrowse, edit, and defform render as rich UI
  • Editor Builtinscursor-pos, selection, buffer-text, insert-at
  • File Tree — Create, rename, delete files with dirty-state indicators
  • Terminal Versions — Swift TUI (eeditor-term) and C/ncurses (eeditor-nc)
EEditor ├─ File Tree Sidebar ├─ Multi-tab Editor ├─ Calendar Panel │ ├─ items-on, items-between │ └─ Daily / Weekly notes ├─ EELisp REPL Tab │ └─ interpreter.eval() └─ Interactive Views ├─ (browse table) → TableView ├─ (edit table) → FormView └─ (defform ...) → CalcForm All GUI queries go through interpreter.eval() — REPL and GUI are always in sync.

Quick Start

Get up and running in under a minute.

1

Clone & Build

EELisp is a Swift package. Clone it and build with SwiftPM.

git clone https://github.com/user/eelisp
cd eelisp
swift build
2

Launch the REPL

Start the interactive REPL or evaluate expressions directly.

swift run eelisp          # REPL
swift run eelisp -e "(+ 1 2)"
swift run eelisp script.el
3

Start Building

Create tables, add agenda items, or open it inside EEditor.

(deftable tasks (title:string done:bool))
(add "Ship v1.0 tomorrow !!")
(items)