Site menu:

Various web development frameworks in Lisp will be described below.

Table of content

  1. UnCommon Web
  2. Core Server
  3. BKNR
  4. HOP

UnCommon Web

The site is built using UnCommon Web, or UCW in short.

Dependencies

To avoid any compatibility problem and to have peace of mind, I use some stable albeit older instances of the recommended dependencies, which can be found at these places:

Some optional Lisp packages, such as cl-l10, which appeared problematic to compile properly, have not been used.

The following patches have to be applied:

ucw_ajax installation

This is the original version of UCW, which uses the Dojo toolkit, provides some Ajax features and some elaborate examples. By laziness, I still use an older release, which you can obtain with that command:

darcs get --to-patch="add safari support to import-ajax-received-xhtml-node" http://common-lisp.net/project/ucw/repos/ucw_ajax/
You have then to apply these patches.

ucw-core installation

As the original UCW authors of ucw_ajax are no more involved in it's development, some UCW users have stepped forward to continue the work. At the beginning of 2009, Drew Crampsie has released a very simplified UCW branch called ucw-core. To avoid having to test every patch published, I use an older release, which you can obtain with that command:

darcs get --to-patch="Actually add paged-list to ucw.asd" http://common-lisp.net/project/ucw/repos/ucw-core/
You have to apply these patches. Most of them add to ucw-core some basic Ajax functionality, and restore the 'tal' template system used in ucw_ajax. The Javascript part is based on jQuery.

This web site: playing with UCW

This host is running Debian Squeeze (i386), using sbcl, mod_lisp and apache2. See the sbcl section as to why I don't use Squeeze sbcl package.

This host runs in the same sbcl instance 3 web servers:

Pay attention to the consequences of such a setup. If you type for instance:
(setf it.bese.ucw:*inspect-components* t)
 
several of your Web sites may be affected.

Out of the box ucw-core is slightly incompatible with ucw_ajax, and can't exist along with ucw_ajax due to name collision. But if you take care of renaming the ucw_core packages, you can run them both in the same Lisp instance. How to do that is explained here.

Live examples of the ucw-core demo and manual examples:

Configuring UCW with mod_lisp and apache2

With the mod_lisp+apache combination, you have to specify rules to redirect URL requests: has the request to be handled by apache or by UCW? Static URL such a CSS styles files, icons, JavaScript and downloadable files can be handled directly by apache; the other URL have to be handled by UCW. An example of such rules is given by the following stanza:

# The root of paths to your static content
DocumentRoot /var/www/lisp-site
<IfModule mod_lisp2.c>
    # we let apache2 know where to contact UCW
    LispServer 127.0.0.1 3000 "Lisp"
    # and by default everything is handed to UCW
    SetHandler lisp-handler
    # except:
    <LocationMatch ".*\.(css|jpg|gif|png|js|ico)$">
      SetHandler none
    </LocationMatch>
    <LocationMatch "/(files|icons)/.*$">
      SetHandler none
    </LocationMatch>
</IfModule>
which has to be put in the configuration files of apache2.

The Web site code

As an example of UCW source code, you can download the current site version here. I hope you can learn a bit of UCW from it, and are welcome to comment on the code, which can certainly be improved.

Remaining caveats

Depending on your Web browser, some demos from the web site running ucw_ajax may not work exactly as expected; this is due to the very old Dojo version used by ucw_ajax. Common culprits are the "Dynamic Form demo" (you are thrown back to the main menu) and the time/date chooser (doesn't appear graphically).

In general, I am not sure all demos work as expected, but I must say that I don't understand them all either...

For security reasons, I had to modify the administration demo, which gives access to a repl.

Directory structure

By applying all the above patches you will clone my system, but you have also to get an accordingly correct directory structure. If /var/www/ucw-site/ is the apache2 DocumentRoot, you will need the following one:

/var/www/ucw-site/:
-rw-r--r-- 1   34 Mar  3 00:29 robots.txt
drwxr-xr-x 2 4096 Feb 14 00:49 shared-counter
drwxr-xr-x 2 4096 Feb 14 00:49 admin
drwxr-xr-x 2 4096 Feb 14 00:49 l10n
drwxr-xr-x 2 4096 Feb 14 00:49 static
lrwxrwxrwx 1   61 Feb 13 23:31 tal -> .../ucw_ajax/examples/wwwroot/tal

/var/www/ucw-site/shared-counter:
lrwxrwxrwx 1 9 Feb 14 00:49 static -> ../static

/var/www/ucw-site/l10n:
lrwxrwxrwx 1 9 Feb 14 00:49 static -> ../static

/var/www/ucw-site/admin:
lrwxrwxrwx 1 9 Feb 14 00:49 static -> ../static

/var/www/ucw-site/static:
lrwxrwxrwx 1   52 Feb 13 23:34 ucw -> .../ucw_ajax/wwwroot/ucw
lrwxrwxrwx 1   53 Feb 13 23:34 dojo -> .../ucw_ajax/wwwroot/dojo
-rw-r--r-- 1 2822 Sep 14  2007 examples.css
-rw-r--r-- 1 3638 Sep 14  2007 favicon.ico

And finally my apache configuration stanza is here.

Core Server

It is a framework closely related to UCW's underlying concepts: http://labs.core.gen.tr/#documentation. A web site using this is: http://www.core.gen.tr/#coretal.

BKNR

Another Lisp framework for building Web sites: http://bknr.net/html/home.html. I may use their htmlize tool for pretty printing code contributions on the forum here.

HOP

A Web framework in Scheme, with a nice look: http://hop.inria.fr