XMLisp
XMLisp uses CLOS and the MOP in such a way as to read XML files into Lisp objects.

Paper: https://www.cs.colorado.edu/~ralex/papers/PDF/X-expressions.pdf

Repository: https://github.com/seanjensengrey/xmlisp

XMLisp is the integration of Lisp with XML. The Lisp Meta Object Protocol is used to establish a simple and highly efficient mapping between CLOS objects and the XML extensible markup language. It is not just an API to read XML files and turn them into some Lisp flavored representation. Instead, it integrates Lisp and XML into one environment at two levels. At a language level it allows the arbitrary combination of Lisp expressions and XML elements. CLOS objects can be printed as XML elements. XML elements evaluate into CLOS objects. At a tool level XMLisp allows users to fluidly experiment with XML. Type XML elements into the Lisp listener. Evaluate complete or parts of hierarchical XML elements. Inspect complex XML elements using the inspector. Get support from symbol completion when editing XML.

XMLisp works on the following systems: MCL 5, 5.1, LispWorks 4.3, OpenMCL 0.13.2, SBCL

Note that I had to change the end-of-line markings to get it to work with SBCL on linux -Dave Watson

Do a 'perl -pi -e "s/\cM/\n/g" ' on each file. This will change ^M into Unix \n and xmlisp runs well on Linux/sbcl Oli Buechel. Or simply use dos2unix command - Marko Kocic

- this is not necessary with version 3.0.3, but for this version you will need the package.lisp from the version 2.3-zipfile - Eirik Mikkelsen

Does the package have an owner? There's no contact information to be found in the zip file. -Thom Goodsell

Dr. Alexander Repenning http://www.cs.colorado.edu/~ralex/

Quick assessment (2024-06-30)

Here's an example of how this is intended to be used:

(defclass window (xml:xml-serializer) ((width :initform 0 :accessor window-width) (height :initform 0 :accessor window-height) (buttons :initform nil :accessor buttons))) (defclass button (xml:xml-serializer) ((text :initform "" :accessor button-text)))

So a window can be defined like this:

(defvar *window* <window width="380" height="140"> <button text="OK"/> <button text="Cancel"/> </window>)

Then we can access attributes:

? (values (window-width *window*) (window-height *window*)) 380 140

And access the list of buttons:

? (buttons *window*) (<button text="OK"/> <button text="Cancel"/>)

Note that each object is re-serialized to XML.