Commit fa49577e authored by Zach Beane's avatar Zach Beane
Browse files

Update the README with more details.

parent 8b6066a7
......@@ -7,9 +7,71 @@ few modifications as possible. That means *occasionally* resorting to
grody one-off hacks instead of elegant beautiful gracefulness.
Where possible, ACL functionality is mimicked with portability
libraries like uiop, bordeaux-threads, cl-ppcre, USOCKET, etc. Where
libraries like [UIOP](,
[USOCKET](, etc. Where
necessary, implementation-specific hacks are used to fill in the gaps.
For example, Allegro CL's non-standard `#+(version>= ...)` expression
is sprinkled throughout aserve code. To work around the problem
without changing the code, zacl installs a readtable that overrides
the standard `#+` and `#-` readers to check for these expressions and
work around them.
Occasionally, a quirk in aserve's source is very difficult to work
around. In those cases, I will send patches to Franz, like for
[double-colon syntax in](,
[obsolete declarations not recognized in other Lisps](,
[non-standard assumptions in array initialization](,
Until those patches are merged or rejected, the
[zacl-compatible aserve fork](
on github has a lightly modified version of aserve that can be used
with zacl to use modern aserve on non-Allegro Lisps. You can check it
out like so:
git clone -b zacl-compatible
## Usage
ZACL defines the packages and functionality that the aserve code
relies upon. But aserve's system definition does not include a
dependency on ZACL. There are a few ways to make sure ZACL is loaded
before aserve.
First, you can manually load ZACL before loading aserve:
(ql:quickload "zacl")
(ql:quickload "aserve")
Second, you can load the "zacl-aserve" shim system:
(ql:quickload "zacl-aserve")
## Limitations
**Only works on Clozure CL**. This is because of time
constraints. Clozure CL's multiprocess API is the same as Allegro's,
so it was trivial to support immediately. There is a tiny bit of
simple-streams support that also relies directly on Clozure stream
functionality, but creating a portability layer that matches the
Clozure/Allegro multiprocess API would help ZACL work on many more
**Does not support CGI**. Another victim of time constraints. I do not
need CGI. CGI functionality requires non-trivial support for managing
subprocesses, and I am not sure if e.g. UIOP's subprocess management
API is sufficient.
**Lightly tested**. My application seems to work. Yours might not. If
you have trouble with ZACL and aserve, feel free to
[create an issue](
and I'll take a look.
**Possibly slow**. Using generic functions and portability layers will
be slower than running aserve natively on Allegro CL. There aren't
many ways around it. If you have a specific performance issue that
you'd like ZACL to address, [get in touch](
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment