diff --git a/CHANGES.current b/CHANGES.current
index 8306b17..de9af55 100644
--- a/CHANGES.current
+++ b/CHANGES.current
@@ -7,6 +7,11 @@
 Version 4.1.0 (in progress)
 ===========================
 
+2021-05-13: olly
+	    [Allegrocl] #2009 Remove code for Allegro Common Lisp.  We dropped
+	    support for it in SWIG 4.0.0 and nobody has stepped forward to
+	    revive it in over 2 years.
+
 2021-05-04: olly
 	    [PHP] #1982 #1457 https://sourceforge.net/p/swig/bugs/1339/
 	    SWIG now only use PHP's C API to implement its wrappers, and no
diff --git a/Doc/Manual/Allegrocl.html b/Doc/Manual/Allegrocl.html
deleted file mode 100644
index 4069ecd..0000000
--- a/Doc/Manual/Allegrocl.html
+++ /dev/null
@@ -1,2150 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<title>SWIG and Allegro Common Lisp</title>
-<link rel="stylesheet" type="text/css" href="style.css">
-<meta http-equiv="content-type" content="text/html; charset=UTF-8">
-</head>
-
-<body bgcolor="#ffffff">
-
-<H1><a name="Allegrocl">20 SWIG and Allegro Common Lisp</a></H1>
-<!-- INDEX -->
-<div class="sectiontoc">
-<ul>
-<li><a href="#Allegrocl_nn2">Basics</a>
-<ul>
-<li><a href="#Allegrocl_nn3">Running SWIG</a>
-<li><a href="#Allegrocl_nn4">Command Line Options</a>
-<li><a href="#Allegrocl_nn5">Inserting user code into generated files</a>
-</ul>
-<li><a href="#Allegrocl_nn6">Wrapping Overview</a>
-<ul>
-<li><a href="#Allegrocl_nn7">Function Wrapping</a>
-<li><a href="#Allegrocl_nn8">Foreign Wrappers</a>
-<li><a href="#Allegrocl_nn9">FFI Wrappers</a>
-<li><a href="#Allegrocl_nn10">Non-overloaded Defuns</a>
-<li><a href="#Allegrocl_nn11">Overloaded Defuns</a>
-<li><a href="#Allegrocl_nn12">What about constant and variable access?</a>
-<li><a href="#Allegrocl_nn13">Object Wrapping</a>
-</ul>
-<li><a href="#Allegrocl_nn14">Wrapping Details</a>
-<ul>
-<li><a href="#Allegrocl_nn15">Namespaces</a>
-<li><a href="#Allegrocl_nn16">Constants</a>
-<li><a href="#Allegrocl_nn17">Variables</a>
-<li><a href="#Allegrocl_nn18">Enumerations</a>
-<li><a href="#Allegrocl_nn19">Arrays</a>
-<li><a href="#Allegrocl_nn20">Classes and Structs and Unions (oh my!)</a>
-<ul>
-<li><a href="#Allegrocl_nn21">CLOS wrapping of</a>
-<li><a href="#Allegrocl_nn22">CLOS Inheritance</a>
-<li><a href="#Allegrocl_nn23">Member fields and functions</a>
-<li><a href="#Allegrocl_nn24">Why not directly access C++ classes using foreign types?</a>
-</ul>
-<li><a href="#Allegrocl_nn25">Templates</a>
-<ul>
-<li><a href="#Allegrocl_nn26">Generating wrapper code for templates</a>
-<li><a href="#Allegrocl_nn27">Implicit Template instantiation</a>
-</ul>
-<li><a href="#Allegrocl_nn28">Typedef, Templates, and Synonym Types</a>
-<ul>
-<li><a href="#Allegrocl_nn29">Choosing a primary type</a>
-</ul>
-<li><a href="#Allegrocl_nn30">Function overloading/Parameter defaulting</a>
-<li><a href="#Allegrocl_nn31">Operator wrapping and Operator overloading</a>
-<li><a href="#Allegrocl_nn32">Varargs</a>
-<li><a href="#Allegrocl_nn33">C++ Exceptions</a>
-<li><a href="#Allegrocl_nn34">Pass by value, pass by reference</a>
-</ul>
-<li><a href="#Allegrocl_nn35">Typemaps</a>
-<ul>
-<li><a href="#Allegrocl_nn36">Code Generation in the C++ Wrapper</a>
-<ul>
-<li><a href="#Allegrocl_nn37">IN Typemap</a>
-<li><a href="#Allegrocl_nn38">OUT Typemap</a>
-<li><a href="#Allegrocl_nn39">CTYPE Typemap</a>
-</ul>
-<li><a href="#Allegrocl_nn40">Code generation in Lisp wrappers</a>
-<ul>
-<li><a href="#Allegrocl_nn41">LIN Typemap</a>
-<li><a href="#Allegrocl_nn42">LOUT Typemap</a>
-<li><a href="#Allegrocl_nn43">FFITYPE Typemap</a>
-<li><a href="#Allegrocl_nn44">LISPTYPE Typemap</a>
-<li><a href="#Allegrocl_nn45">LISPCLASS Typemap</a>
-</ul>
-<li><a href="#Allegrocl_nn46">Modifying SWIG behavior using typemaps</a>
-</ul>
-<li><a href="#Allegrocl_nn47">Identifier Converter functions</a>
-<ul>
-<li><a href="#Allegrocl_nn48">Creating symbols in the lisp environment</a>
-<li><a href="#Allegrocl_nn49">Existing identifier-converter functions</a>
-<ul>
-<li><a href="#Allegrocl_nn50">identifier-convert-null</a>
-<li><a href="#Allegrocl_nn51">identifier-convert-lispify</a>
-<li><a href="#Allegrocl_nn52">Default identifier to symbol conversions</a>
-</ul>
-<li><a href="#Allegrocl_nn53">Defining your own identifier-converter</a>
-<li><a href="#Allegrocl_nn54">Instructing SWIG to use a particular identifier-converter</a>
-</ul>
-</ul>
-</div>
-<!-- INDEX -->
-
-
-
-<p>
-This chapter describes SWIG's support of Allegro Common Lisp. Allegro
-CL is a full-featured implementation of the Common Lisp language
-standard that includes many vendor-specific enhancements and add-on
-modules for increased usability.
-</p>
-
-<p>
-One such module included in Allegro CL is the Foreign Functions
-Interface (FFI). This module, tailored primarily toward interfacing
-with C/C++ and, historically, Fortran, provides a means by which
-compiled foreign code can be loaded into a running lisp
-environment and executed. The interface supports the calling of
-foreign functions and methods, allows for executing lisp routines
-from foreign code (callbacks), and the passing of data between foreign
-and lisp code.
-</p>
-
-<p>
-The goal of this module is to make it possible to quickly generate the
-necessary foreign function definitions so one can make use of C/C++
-foreign libraries directly from lisp without the tedium of having to
-code them by hand. When necessary, it will also generate further C/C++
-code that will need to be linked with the intended library for proper
-interfacing from lisp. It has been designed with an eye toward
-flexibility. Some foreign function calls may release the heap, while
-other should not. Some foreign functions should automatically convert
-lisp strings into native strings, while others should not. These
-adjustments and many more are possible with the current module.
-</p>
-
-<p>
-It is significant to note that, while this is a vendor-specific
-module, we would like to acknowledge the current and ongoing
-work by developers in the open source lisp community that are
-working on similar interfaces to implementation-independent
-foreign function interfaces (CFFI, for example). Such
-work can only benefit the lisp community, and we would not
-be unhappy to see some enterprising folk use this work to add
-to it.
-</p>
-
-<H2><a name="Allegrocl_nn2">20.1 Basics</a></H2>
-
-
-<H3><a name="Allegrocl_nn3">20.1.1 Running SWIG</a></H3>
-
-
-<p>
-If you're reading this, you must have some library you need to
-generate an interface for. In order for SWIG to do this work, however,
-it needs a bit of information about how it should go about creating
-your interface, and what you are interfacing to.
-</p>
-
-<p>
-SWIG expects a description of what in the foreign interface you wish
-to connect to. It must consisting of C/C++ declarations and special
-SWIG directives. SWIG can be furnished with a header file, but an
-interface can also be generated without library headers by supplying a
-simple text file--called the interface file, which is typically named
-with a <tt>.i</tt> extension--containing any foreign declarations of
-identifiers you wish to use. The most common approach is to use an
-interface file with directives to parse the needed headers. A straight
-parse of library headers will result in usable code, but SWIG
-directives provides much freedom in how a user might tailor the
-generated code to their needs or style of coding.
-</p>
-
-<p>
-Note that SWIG does not require any function definitions; the
-declarations of those functions is all that is necessary. Be careful
-when tuning the interface as it is quite possible to generate code
-that will not load or compile.
-</p>
-
-<p>
-An example interface file is shown below. It makes use of two SWIG
-directives, one of which requests that the declarations in a header
-file be used to generate part of the interface, and also includes an
-additional declaration to be added.</p>
-
-<div class="code">example.i
-<pre>
-%module example
-
-%include "header.h"
-
-int fact(int n);
-</pre>
-</div>
-
-<p>The contents of header.h are very simple:</p>
-<div class="code">header.h
-<pre>
-int fact(char *statement);   // pass it a fact, and it will rate it.
-</pre>
-</div>
-
-<p>The contents of example.cl will look like this:</p>
-
-<div class="targetlang">example.cl
-<pre>
-(defpackage :example
-  (:use :common-lisp :swig :ff :excl))
-
-  ... helper routines for defining the interface ...
-
-(swig-in-package ())
-
-(swig-defun ("fact")
-  ((PARM0_statement cl:string (* :char) ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_statement))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-defun ("fact")
-  ((PARM0_n cl:integer :int ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_n))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-dispatcher ("fact" :type :function :arities (1)))
-</pre>
-</div>
-
-<p>
-The generated file contains calls to internal swig helper
-functions. In this case there are two calls to swig-defun.
-These calls will expand into code that will make the appropriate
-definitions using the Allegro FFI. Note also, that this code is
-<b>erroneous</b>. Function overloading is not supported in C, and this
-code will not compile even though SWIG did not complain.
-</p>
-
-<p>
-In order to generate a C interface to Allegro CL using this code run
-swig using the <tt>-allegrocl</tt> option, as below:
-</p>
-
-<div class="shell">
-<pre>
-% swig -allegrocl example.i
-</pre>
-</div>
-
-<p>
-When building an interface to C++ code, include the <tt>-c++</tt> option:
-</p>
-
-<div class="shell">
-<pre>
-% swig -allegrocl -c++ example.i
-</pre>
-</div>
-
-<p>
-As a result of running one of the above commands, a file named <tt>example.cl</tt> 
-will be generated containing the lisp side of the interface. As well, a file 
-<tt>example_wrap.cxx</tt> is also generated, containing C/C++ wrapper code to
-facilitate access to C++ methods, enumeration values, and constant values.
-Wrapper functions are necessary in C++ due to the lack of a standard for mangling 
-the names of symbols across all C++ compilers. These wrapper functions are
-exported from the shared library as appropriate, using the C name mangling
-convention. The lisp code that is generated will interface to your foreign
-library through these wrappers.
-</p>
-
-<p>
-It is possible to disable the creation of the .cxx file when generating a C
-interface by using the -nocwrap command-line argument. For interfaces that
-don't contain complex enum or constant expressions, contain nested struct/union
-declarations, or doesn't need to use many of the SWIG customization featuers, 
-this will result in a more streamlined, direct interface to the
-intended module.
-</p>
-
-<p>
-The generated wrapper file is below. It contains very simple
-wrappers by default, that simply pass the arguments to the
-actual function.
-</p>
-
-<div class="code">example_wrap.i
-<pre>
-  ... lots of SWIG internals ...
-
-EXPORT int ACL___fact__SWIG_0 (char *larg1) {
-  int lresult = (int)0 ;
-  char *arg1 = (char *) 0 ;
-  int result;
-
-  arg1 = larg1;
-  try {
-    result = (int)fact(arg1);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (int)0;
-  }
-}
-
-
-EXPORT int ACL___fact__SWIG_1 (int larg1) {
-  int lresult = (int)0 ;
-  int arg1 ;
-  int result;
-
-  arg1 = larg1;
-  try {
-    result = (int)fact(arg1);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (int)0;
-  }
-}
-</pre>
-</div>
-
-<p>
-And again, the generated lisp code. Note that it differs from
-what is generated when parsing C code:
-</p>
-
-<div class="targetlang">
-<pre>
-  ...
-
-(swig-in-package ())
-
-(swig-defmethod ("fact" "ACL___fact__SWIG_0" :type :function :arity 1)
-  ((PARM0_statement cl:string (* :char) ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_statement))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-defmethod ("fact" "ACL___fact__SWIG_1" :type :function :arity 1)
-  ((PARM0_n cl:integer :int ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_n))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-dispatcher ("fact" :type :function :arities (1)))
-</pre>
-</div>
-
-<p>In this case, the interface generates two swig-defmethod forms and
-a swig-dispatcher form. This provides a single functional interface for
-all overloaded routines. A more detailed description of this features 
-is to be found in the section titled <b>Function overloading/Parameter defaulting</b>.
-
-<p>
-In order to load a C++ interface, you will need to build a shared library
-from example_wrap.cxx. Be sure to link in the actual library you created
-the interface for, as well as any other dependent shared libraries. For
-example, if you intend to be able to call back into lisp, you will also
-need to link in the Allegro shared library. The library you create from
-the C++ wrapper will be what you then load into Allegro CL.
-</p>
-
-<H3><a name="Allegrocl_nn4">20.1.2 Command Line Options</a></H3>
-
-
-<p>
-There are three Allegro CL specific command-line option:
-</p>
-
-<div class="shell">
-<pre>
-swig -allegrocl [ options ] filename
-
-   -identifier-converter [name] - Binds the variable swig:*swig-identifier-convert* 
-                                  in the generated .cl file to <tt>name</tt>.
-                                  This function is used to generate symbols
-                                  for the lisp side of the interface.
-
-   -cwrap - [default] Generate a .cxx file containing C wrapper function when
-            wrapping C code. The interface generated is similar to what is
-            done for C++ code.
-   -nocwrap - Explicitly turn off generation of .cxx wrappers for C code. Reasonable
-              for modules with simple interfaces. Can not handle all legal enum
-              and constant constructs, or take advantage of SWIG customization features.
-
-   -isolate - With this command-line argument, all lisp helper functions are defined
-              in a unique package named <tt>swig.&lt;module-name&gt;</tt> rather than
-              <tt>swig</tt>. This prevents conflicts when the module is
-              intended to be used with other swig generated interfaces that may,
-              for instance, make use of different identifier converters.
-</pre>
-</div>
-
-<p>
-See <a href="#Allegrocl_nn47">Section 17.5 Identifier converter
-functions</a> for more details.
-</p>
-
-<H3><a name="Allegrocl_nn5">20.1.3 Inserting user code into generated files</a></H3>
-
-
-<p>
-It is often necessary to include user-defined code into the
-automatically generated interface files. For example, when building
-a C++ interface, example_wrap.cxx will likely not compile unless
-you add a <tt>#include "header.h"</tt> directive. This can be done
-using the SWIG <tt>%insert(section) %{ ...code... %}</tt> directive:
-</p>
-
-<div class="code">
-<pre>
-%module example
-
-%{
-#include "header.h"
-%}
-
-%include "header.h"
-
-int fact(int n);
-</pre>
-</div>
-
-<p>
-Additional sections have been added for inserting into the
-generated lisp interface file
-</p>
-<ul>
-  <li><tt>lisphead</tt> - inserts before type declarations</li>
-  <li><tt>lisp</tt> - inserts after type declarations according to
-    where it appears in the .i file</li>
-</ul>
-<p>
-Note that the block <tt>%{ ... %}</tt> is effectively a shortcut for
-<tt>%insert("header") %{ ... %}</tt>.
-</p>
-
-
-<H2><a name="Allegrocl_nn6">20.2 Wrapping Overview</a></H2>
-
-
-<p>
-New users to SWIG are encouraged to read
-<a href="SWIG.html#SWIG">SWIG Basics</a>, and
-<a href="SWIGPlus.html#SWIGPlus">SWIG and C++</a>, for those
-interested in generating an interface to C++.
-</p>
-
-<H3><a name="Allegrocl_nn7">20.2.1 Function Wrapping</a></H3>
-
-
-  <p>
-  Writing lisp code that directly invokes functions at the foreign
-  function interface level can be cumbersome. Data must often be
-  translated between lisp and foreign types, data extracted from
-  objects, foreign objects allocated and freed upon completion of
-  the foreign call. Dealing with pointers can be unwieldy when it
-  comes to keeping them distinct from other valid integer values.
-  </p>
-
-  <p>
-  We make an attempt to ease some of these burdens by making the
-  interface to foreign code much more lisp-like, rather than C
-  like. How this is done is described in later chapters. The
-  layers themselves, appear as follows:
-  </p>
-
-  <div class="diagram">
-  <pre>
-        ______________
-       |              |  (foreign side)
-       | Foreign Code |  What we're generating an interface to.
-       |______________|
-               |
-               |
-        _______v______
-       |              |  (foreign side)
-       | Wrapper code |  extern "C" wrappers calling C++ 
-       |______________|  functions and methods.
-               |
-    .  . . - - + - - . .  .
-        _______v______
-       |              |  (lisp side)
-       |  FFI Layer   |  Low level lisp interface. ff:def-foreign-call,
-       |______________|  ff:def-foreign-variable
-               |
-               +----------------------------
-        _______v______              _______v______
-       |              |            |              | (lisp side)    
-       |    Defuns    |            |  Defmethods  | wrapper for overloaded
-       |______________|            |______________| functions or those with
-        (lisp side)                        |        defaulted arguments
-        Wrapper for non-overloaded         |
-        functions and methods       _______v______
-                                   |              | (lisp side)
-                                   |    Defuns    | dispatch function
-                                   |______________| to overloads based
-                                                    on arity
-  </pre>
-  </div>
-
-<H3><a name="Allegrocl_nn8">20.2.2 Foreign Wrappers</a></H3>
-
-
-  <p>
-    These wrappers are as generated by SWIG default. The types of
-    function parameters can be transformed in place using the CTYPE
-    typemap. This is use for converting pass-by-value parameters to
-    pass-by-reference where necessary. All wrapper parameters are then
-    bound to local variables for possible transformation of values
-    (see LIN typemap). Return values can be transformed via the OUT
-    typemap. 
-  </p>
-
-<H3><a name="Allegrocl_nn9">20.2.3 FFI Wrappers</a></H3>
-
-
-  <p>
-    These are the generated ff:def-foreign-call forms. No typemaps are
-    applicable to this layer, but the <tt>%ffargs</tt> directive is
-    available for use in .i files, to specify which keyword arguments
-    should be specified for a given function.
-  </p>
-  
-  <div class="code">ffargs.i:
-  <pre>
-%module ffargs
-
-%ffargs(strings_convert="nil", call_direct="t") foo;
-%ffargs(strings_convert="nil", release_heap=":never", optimize_for_space="t") bar;
-
-int foo(float f1, float f2);
-int foo(float f1, char c2);
-
-void bar(void *lisp_fn);
-
-char *xxx();
-  </pre>
-  </div>
-
-  <p>Generates:
-  </p>
-  <div class="targetlang">ffargs.cl:
-  <pre>
-(swig-in-package ())
-
-(swig-defmethod ("foo" "ACL___foo__SWIG_0" :type :function :arity 2)
-  ((PARM0_f1 cl:single-float :float )
-   (PARM1_f2 cl:single-float :float ))
-  (:returning (:int )
-   :call-direct t
-   :strings-convert nil)
-  (let ((SWIG_arg0 PARM0_f1))
-  (let ((SWIG_arg1 PARM1_f2))
-  (swig-ff-call SWIG_arg0 SWIG_arg1))))
-
-(swig-defmethod ("foo" "ACL___foo__SWIG_1" :type :function :arity 2)
-  ((PARM0_f1 cl:single-float :float )
-   (PARM1_c2 cl:character :char character))
-  (:returning (:int )
-   :call-direct t
-   :strings-convert nil)
-  (let ((SWIG_arg0 PARM0_f1))
-  (let ((SWIG_arg1 PARM1_c2))
-  (swig-ff-call SWIG_arg0 SWIG_arg1))))
-
-(swig-dispatcher ("foo" :type :function :arities (2)))
-(swig-defun ("bar" "ACL___bar__SWIG_0" :type :function)
-  ((PARM0_lisp_fn  (* :void) ))
-  (:returning (:void )
-   :release-heap :never
-   :optimize-for-space t
-   :strings-convert nil)
-  (let ((SWIG_arg0 PARM0_lisp_fn))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("xxx" "ACL___xxx__SWIG_0" :type :function)
-  (:void)
-  (:returning ((* :char) )
-   :strings-convert t)
-  (swig-ff-call))
-  </pre>
-  </div>
-
-  <div class="code">
-    <pre>%ffargs(strings_convert="t");</pre>
-  </div>
-
-  <p>
-    Is the only default value specified in <tt>allegrocl.swg</tt> to force
-    the muffling of warnings about automatic string conversion when defining
-    ff:def-foreign-call's.
-  </p>
-
-<H3><a name="Allegrocl_nn10">20.2.4 Non-overloaded Defuns</a></H3>
-
-
-  <p>
-    These are simple defuns. There is no typechecking of arguments.
-    Parameters are bound to local variables for possible
-    transformation of values, such as pulling values out of instance
-    slots or allocating temporary stack allocated structures, via the
-    <tt>lin</tt> typemap. These arguments are then passed to the
-    foreign-call (where typechecking may occur). The return value from
-    this function can be manipulated via the <tt>lout</tt> typemap.
-  </p>
-
-<H3><a name="Allegrocl_nn11">20.2.5 Overloaded Defuns</a></H3>
-
-
-  <p>
-    In the case of overloaded functions, multiple layers are
-    generated. First, all the overloads for a given name are separated
-    out into groups based on arity, and are wrapped in
-    defmethods. Each method calls a distinct wrapper function, but are
-    themselves distinguished by the types of their arguments
-    (see <tt>lispclass</tt> typemap). These are further wrapped in a
-    dispatching function (defun) which will invoke the appropriate
-    generic-function based on arity. This provides a single functional
-    interface to all overloads. The return value from this function
-    can be manipulated via the <tt>lout</tt> typemap.
-  </p>
-
-<H3><a name="Allegrocl_nn12">20.2.6 What about constant and variable access?</a></H3>
-
-
-  <p>
-    Along with the described functional layering, when creating a .cxx wrapper, 
-    this module will generate getter and--if not immutable--setter,
-    functions for variables and constants. If the -nocwrap option is used,
-    <tt>defconstant</tt> and <tt>ff:def-foreign-variable</tt> forms will be
-    generated for accessing constants and global variables. These, along with
-    the <tt>defuns</tt> listed above are the intended API for calling
-    into the foreign module.
-  </p>
-
-<H3><a name="Allegrocl_nn13">20.2.7 Object Wrapping</a></H3>
-
-
-  <p>
-  All non-primitive types (Classes, structs, unions, and typedefs
-  involving same) have a corresponding foreign-type defined on the
-  lisp side via ff:def-foreign-type.
-  </p>
-
-  <p>
-  All non-primitive types are further represented by a CLOS class,
-  created via defclass. An attempt is made to create the same class
-  hierarchy, with all classes inheriting directly or indirectly from
-  ff:foreign-pointer. Further, wherever it is apparent, all pointers
-  returned from foreign code are wrapped in a CLOS instance of the
-  appropriate class. For ff:def-foreign-calls that have been defined
-  to expect a :foreign-address type as argument, these CLOS instances
-  can legally be passed and the pointer to the C++ object
-  automatically extracted. This is a natural feature of Allegro's
-  foreign function interface.
-  </p>
-
-<H2><a name="Allegrocl_nn14">20.3 Wrapping Details</a></H2>
-
-
-  <p>
-    In this section is described how particular C/C++ constructs are
-    translated into lisp.
-  </p>
-
-<H3><a name="Allegrocl_nn15">20.3.1 Namespaces</a></H3>
-
-
-  <p>
-    C++ namespaces are translated into Lisp packages by SWIG. The
-    Global namespace is mapped to a package named by the <tt>%module</tt>
-    directive or the <tt>-module</tt> command-line argument. Further
-    namespaces are generated by the <tt>swig-defpackage</tt> utility
-    function and given names based on Allegro CLs nested namespace
-    convention. For example:
-  </p>
-
-    <div class="code">foo.i:
-    <pre>
-%module foo
-
-%{
-#include "foo.h"
-%}
-
-%include "foo.h"
-
-namespace car {
-  ...
-  namespace tires {
-    int do_something(int n);
-  }
-}
-    </pre>
-    </div>
-  <p>Generates the following code.
-  </p>
-    <div class="targetlang">foo.cl
-    <pre>
-(defpackage :foo
-  (:use :common-lisp :swig :ff :excl))
-
-...
-
-(swig-defpackage ("car"))
-(swig-defpackage ("car" "tires"))
-
-...
-
-(swig-in-package ("car" "tires"))
-(swig-defun ("do_something" "ACL_car_tires__do_something__SWIG_0" :type :function)
-  ((PARM0_n  :int ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_n))
-  (swig-ff-call SWIG_arg0)))
-    </pre>
-    </div>
-
-    <p>
-      The above interface file would cause packages foo, foo.car, and
-      foo.car.tires to be created. One would find the function wrapper
-      for do_something defined in the foo.car.tires package(*).
-    </p>
-
-    <p>(<b>*</b>) Except for the package named by the module, all
-      namespace names are passed to the identifier-converter-function
-      as strings with a <tt>:type</tt> of <tt>:namespace</tt>. It is the
-      job of this function to generate the desired symbol, accounting for
-      case preferences, additional naming cues, etc.
-    </p>
-
-    <p>
-      Note that packages created by <tt>swig-defpackage</tt> do not
-      use the COMMON-LISP or EXCL package. This reduces possible
-      conflicts when defining foreign types via the SWIG interface
-      in <b>all but the toplevel modules package</b>. This may
-      lead to confusion if, for example, the current package is
-      <tt>foo.car.tires</tt> and you attempt to use a common-lisp
-      function such as <tt>(car '(1 2 3)</tt>.
-    </p>
-
-<H3><a name="Allegrocl_nn16">20.3.2 Constants</a></H3>
-
-
-    
-    <p>
-      Constants, as declared by the preprocessor #define macro or SWIG
-      <tt>%constant</tt> directive, are included in SWIG's parse tree
-      when it can be determined that they are, or could be reduced to,
-      a literal value. Such values are translated into defconstant
-      forms in the generated lisp wrapper when the -nocwrap command-line
-      options is used. Else, wrapper functions are generated as in the
-      case of variable access (see section below).
-    </p>
-    <p>
-      Here are examples of simple preprocessor constants when using -nocwrap.
-    </p>
-      <div class="code">
-      <pre>
-#define A 1                    =&gt; (swig-defconstant "A" 1)  
-#define B 'c'                  =&gt; (swig-defconstant "B" #\c)
-#define C B                    =&gt; (swig-defconstant "C" #\c)
-#define D 1.0e2                =&gt; (swig-defconstant "D" 1.0d2)
-#define E 2222                 =&gt; (swig-defconstant "E" 2222)
-#define F (unsigned int)2222   =&gt; no code generated
-#define G 1.02e2f              =&gt; (swig-defconstant "G" 1.02f2)
-#define H foo                  =&gt; no code generated
-      </pre>
-      </div>
-
-      <p>
-      Note that where SWIG is unable to determine if a constant is
-      a literal, no node is added to the SWIG parse tree, and so
-      no values can be generated.
-      </p>
-
-    <p>
-      For preprocessor constants containing expressions which can be
-      reduced to literal values, nodes are created, but with no simplification
-      of the constant value. A very very simple infix to prefix converter
-      has been implemented that tries to do the right thing for simple cases, but
-      does not for more complex expressions. If the literal parser determines
-      that something is wrong, a warning will be generated and the literal 
-      expression will be included in the generated code, but commented out.
-    </p>
-      
-      <div class="code">
-      <pre>
-#define I A + E                =&gt; (swig-defconstant "I" (+ 1 2222))
-#define J 1|2                  =&gt; (swig-defconstant "J" (logior 1 2))
-#define Y 1 + 2 * 3 + 4        =&gt; (swig-defconstant "Y" (* (+ 1 2) (+ 3 4)))
-#define Y1 (1 + 2) * (3 + 4)   =&gt; (swig-defconstant "Y1" (* (+ 1 2) (+ 3 4)))
-#define Y2 1 * 2 + 3 * 4       =&gt; (swig-defconstant "Y2" (* 1 (+ 2 3) 4))  ;; WRONG
-#define Y3 (1 * 2) + (3 * 4)   =&gt; (swig-defconstant "Y3" (* 1 (+ 2 3) 4))  ;; WRONG
-#define Z 1 + 2 - 3 + 4 * 5    =&gt; (swig-defconstant "Z" (* (+ 1 (- 2 3) 4) 5)) ;; WRONG
-      </pre>
-      </div>
-      <p>
-      Users are cautioned to get to know their constants before use, or
-      not use the <tt>-nocwrap</tt> command-line option.
-      </p>
-
-<H3><a name="Allegrocl_nn17">20.3.3 Variables</a></H3>
-
-
-    <p>
-      For C wrapping, a def-foreign-variable call is generated for access
-      to global variables.
-    </p>
-    <p>
-      When wrapping C++ code, both global and member variables, getter
-      wrappers are generated for accessing their value, and if not immutable,
-      setter wrappers as well. In the example below, note the lack of a 
-      setter wrapper for global_var, defined as const.
-    </p>
-
-    <div class="code">vars.h
-    <pre>
-namespace nnn {
-  int const global_var = 2;
-  float glob_float = 2.0;
-}
-    </pre>
-    </div>
-
-    <p>
-    Generated code:
-    </p>
-    <div class="targetlang">vars.cl
-    <pre>
-(swig-in-package ("nnn"))
-(swig-defun ("global_var" "ACL_nnn__global_var_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning (:int )
-   :strings-convert t)
-  (swig-ff-call))
-
-
-(swig-defun ("glob_float" "ACL_nnn__glob_float_set__SWIG_0" :type :setter)
-  ((PARM0_glob_float  :float ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_glob_float))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("glob_float" "ACL_nnn__glob_float_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning (:float )
-   :strings-convert t)
-  (swig-ff-call))
-    </pre>
-    </div>
-
-    <p>
-      Note also, that where applicable, setter wrappers are implemented
-      as setf methods on the getter function, providing a lispy interface
-      to the foreign code.
-    </p>
-
-    <div class="targetlang">
-    <pre>
-user&gt; (load "globalvar.dll")
-; Foreign loading globalvar.dll.
-t
-user&gt; (load "globalvar.cl")
-; Loading c:\mikel\src\swig\test\globalvar.cl
-t
-user&gt; 
-globalvar&gt; (globalvar.nnn::global_var)
-2
-globalvar&gt; (globalvar.nnn::glob_float)
-2.0
-globalvar&gt; (setf (globalvar.nnn::glob_float) 3.0)
-3.0
-globalvar&gt; (globalvar.nnn::glob_float)
-3.0
-    </pre>
-    </div>
-
-<H3><a name="Allegrocl_nn18">20.3.4 Enumerations</a></H3>
-
-
-    <p>
-      In C, an enumeration value is an integer value, while in C++ an
-      enumeration value is implicitly convertible to an integer value,
-      but can also be distinguished by its enum type. For each enum
-      declaration a def-foreign-type is generated, assigning the enum
-      a default type of :int. Users may adjust the foreign type of
-      enums via SWIG <tt>typemaps</tt>.
-    </p>
-
-    <p>
-      Enum values are a bit trickier as they can be initialized using
-      any valid C/C++ expression. In C with the -nocwrap command-line option,
-      we handle the typical cases (simple integer initialization) and
-      generate a defconstant form for each enum value. This has the advantage
-      of it not being necessary to probe into foreign space to retrieve enum
-      values. When generating a .cxx wrapper file, a more general solution is
-      employed. A wrapper variable is created in the module_wrap.cxx file, and
-      a ff:def-foreign-variable call is generated to retrieve its value into lisp.
-    </p>
-
-    <p>For example, the following header file
-      <div class="code">enum.h:
-      <pre>
-enum COL { RED, GREEN, BLUE };
-enum FOO { FOO1 = 10, FOO2, FOO3 };
-      </pre>
-      </div>
-      <p>
-      In -nocwrap mode, generates
-      </p>
-      <div class="targetlang">enum.cl:
-      <pre>
-(swig-def-foreign-type "COL" :int)
-(swig-defconstant "RED" 0)
-(swig-defconstant "GREEN" (+ #.(swig-insert-id "RED" () :type :constant) 1))
-(swig-defconstant "BLUE" (+ #.(swig-insert-id "GREEN" () :type :constant) 1))
-
-(swig-def-foreign-type "FOO" :int)
-(swig-defconstant "FOO1" 10)
-(swig-defconstant "FOO2" (+ #.(swig-insert-id "FOO1" () :type :constant) 1))
-(swig-defconstant "FOO3" (+ #.(swig-insert-id "FOO2" () :type :constant) 1))
-      </pre>
-      </div>
-
-    <p>And when generating a .cxx wrapper
-      <div class="code">enum_wrap.cxx:
-      <pre>
-EXPORT const int ACL_ENUM___RED__SWIG_0 = RED;
-EXPORT const int ACL_ENUM___GREEN__SWIG_0 = GREEN;
-EXPORT const int ACL_ENUM___BLUE__SWIG_0 = BLUE;
-EXPORT const int ACL_ENUM___FOO1__SWIG_0 = FOO1;
-EXPORT const int ACL_ENUM___FOO2__SWIG_0 = FOO2;
-EXPORT const int ACL_ENUM___FOO3__SWIG_0 = FOO3;
-      </pre>
-      </div>
-    <p>
-    and
-    </p>
-      <div class="targetlang">enum.cl:
-      <pre>
-(swig-def-foreign-type "COL" :int)
-(swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
-(swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
-(swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
-
-(swig-def-foreign-type "FOO" :int)
-(swig-defvar "FOO1" "ACL_ENUM___FOO1__SWIG_0" :type :constant)
-(swig-defvar "FOO2" "ACL_ENUM___FOO2__SWIG_0" :type :constant)
-(swig-defvar "FOO3" "ACL_ENUM___FOO3__SWIG_0" :type :constant)
-
-      </pre>
-      </div>
-
-<H3><a name="Allegrocl_nn19">20.3.5 Arrays</a></H3>
-
-
-    <p>
-    One limitation in the Allegro CL foreign-types module, is that,
-    without macrology, expressions may not be used to specify the
-    dimensions of an array declaration. This is not a horrible
-    drawback unless it is necessary to allocate foreign structures
-    based on the array declaration using ff:allocate-fobject. When it
-    can be determined that an array bound is a valid numeric value,
-    SWIG will include this in the generated array declaration on the
-    lisp side, otherwise the value will be included, but commented out.
-    </p>
-
-    <p>
-      Below is a comprehensive example, showing a number of legal
-      C/C++ array declarations and how they are translated
-      into foreign-type specifications in the generated lisp code.
-    </p>
-    <div class="code">array.h
-    <pre>
-#define MAX_BUF_SIZE 1024
-
-namespace FOO {
-  int global_var1[13];
-  float global_var2[MAX_BUF_SIZE];
-
-}
-
-enum COLOR { RED = 10, GREEN = 20, BLUE, PURPLE = 50, CYAN };
-
-namespace BAR {
-  char global_var3[MAX_BUF_SIZE + 1];
-  float global_var4[MAX_BUF_SIZE][13];
-  signed short global_var5[MAX_BUF_SIZE + MAX_BUF_SIZE];
-
-  int enum_var5[GREEN];
-  int enum_var6[CYAN];
-
-  COLOR enum_var7[CYAN][MAX_BUF_SIZE];
-}
-    </pre>
-    </div>
-
-    <p>
-    Generates:
-    </p>
-
-    <div class="targetlang">array.cl
-    <pre>
-(in-package #.*swig-module-name*)
-
-(swig-defpackage ("FOO"))
-(swig-defpackage ("BAR"))
-
-(swig-in-package ())
-(swig-def-foreign-type "COLOR" :int)
-(swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
-(swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
-(swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
-(swig-defvar "PURPLE" "ACL_ENUM___PURPLE__SWIG_0" :type :constant)
-(swig-defvar "CYAN" "ACL_ENUM___CYAN__SWIG_0" :type :constant)
-
-(swig-in-package ())
-
-(swig-defconstant "MAX_BUF_SIZE" 1024)
-(swig-in-package ("FOO"))
-
-(swig-defun ("global_var1" "ACL_FOO__global_var1_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning ((* :int) )
-   :strings-convert t)
-  (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
-
-
-(swig-defun ("global_var2" "ACL_FOO__global_var2_set__SWIG_0" :type :setter)
-  ((global_var2  (:array :float 1024) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 global_var2))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-in-package ())
-(swig-in-package ("BAR"))
-(swig-defun ("global_var3" "ACL_BAR__global_var3_set__SWIG_0" :type :setter)
-  ((global_var3  (:array :char #|1024+1|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 global_var3))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("global_var4" "ACL_BAR__global_var4_set__SWIG_0" :type :setter)
-  ((global_var4  (:array (:array :float 13) 1024) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 global_var4))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("global_var4" "ACL_BAR__global_var4_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning ((* (:array :float 13)) )
-   :strings-convert t)
-  (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
-
-
-(swig-defun ("global_var5" "ACL_BAR__global_var5_set__SWIG_0" :type :setter)
-  ((global_var5  (:array :short #|1024+1024|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 global_var5))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("enum_var5" "ACL_BAR__enum_var5_set__SWIG_0" :type :setter)
-  ((enum_var5  (:array :int #|GREEN|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 enum_var5))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("enum_var6" "ACL_BAR__enum_var6_set__SWIG_0" :type :setter)
-  ((enum_var6  (:array :int #|CYAN|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 enum_var6))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("enum_var7" "ACL_BAR__enum_var7_set__SWIG_0" :type :setter)
-  ((enum_var7  (:array (:array #.(swig-insert-id "COLOR" ()) 1024) #|CYAN|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 enum_var7))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("enum_var7" "ACL_BAR__enum_var7_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning ((* (:array #.(swig-insert-id "COLOR" ()) 1024)) )
-   :strings-convert t)
-  (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
-    </pre>
-    </div>
-
-<H3><a name="Allegrocl_nn20">20.3.6 Classes and Structs and Unions (oh my!)</a></H3>
-
-
-<H4><a name="Allegrocl_nn21">20.3.6.1 CLOS wrapping of</a></H4>
-
-
-    <p>
-      Classes, unions, and structs are all treated the same way by the
-      interface generator. For any of these objects, a
-      def-foreign-type and a defclass form are generated.  For every
-      function that returns an object (or pointer/reference) of C/C++
-      type <tt>X</tt>, the wrapping defun (or defmethod) on the Lisp
-      side will automatically wrap the pointer returned in an instance
-      of the appropriate class. This makes it much easier to write and
-      debug code than if pointers were passed around as a jumble of
-      integer values.
-    </p>
-
-<H4><a name="Allegrocl_nn22">20.3.6.2 CLOS Inheritance</a></H4>
-
-
-    <p>
-      The CLOS class schema generated by the interface mirrors the
-      inheritance of the classes in foreign code, with the
-      ff:foreign-pointer class at its root. ff:foreign-pointer is a thin
-      wrapper for pointers that is made available by the foreign function
-      interface. Its key benefit is that it may be passed as an argument
-      to any ff:def-foreign-call that is expecting a pointer as the
-      parameter.
-    </p>
-
-<H4><a name="Allegrocl_nn23">20.3.6.3 Member fields and functions</a></H4>
-
-
-    <p>
-      All public fields will have accessor getter/setter functions
-      generated for them, as appropriate. All public member functions
-      will have wrapper functions generated.
-    </p>
-
-    <p>
-      We currently ignore anything that isn't <tt>public</tt> (i.e.
-      <tt>private</tt> or <tt>protected</tt>), because the C++ compiler
-      won't allow the wrapper functions to access such fields. Likewise,
-      the interface does nothing for <tt>friend</tt> directives, 
-    </p>
-
-<H4><a name="Allegrocl_nn24">20.3.6.4 Why not directly access C++ classes using foreign types?</a></H4>
-
-
-    <p>
-      The def-foreign-type generated by the SWIG interface is
-      currently incomplete. We can reliably generate the object layout
-      of simple structs and unions; they can be allocated via
-      ff:allocate-fobject, and their member variables accessed
-      directly using the various ff:fslot-value-* functions. However,
-      the layout of C++ classes is more complicated. Different
-      compilers adjust class layout based on inheritance patterns, and
-      the presence of virtual member functions. The size of member
-      function pointers vary across compilers as well. As a result, it
-      is recommended that users of any generated interface not attempt
-      to access C++ instances via the foreign type system, but instead
-      use the more robust wrapper functions. 
-    </p>
-
-<H3><a name="Allegrocl_nn25">20.3.7 Templates</a></H3>
-
-
-    
-<H4><a name="Allegrocl_nn26">20.3.7.1 Generating wrapper code for templates</a></H4>
-
-
-<p>
-SWIG provides support for dealing with templates, but by
-default, it will not generate any member variable or function
-wrappers for templated classes. In order to create these
-wrappers, you need to explicitly tell SWIG to instantiate
-them. This is done via the
-<a href="SWIGPlus.html#SWIGPlus_nn30"><tt>%template</tt></a>
-directive.
-</p>
-
-<H4><a name="Allegrocl_nn27">20.3.7.2 Implicit Template instantiation</a></H4>
-
-
-<p>
-While no wrapper code is generated for accessing member
-variables, or calling member functions, type code is generated
-to include these templated classes in the foreign-type and CLOS
-class schema.
-</p>
-
-<H3><a name="Allegrocl_nn28">20.3.8 Typedef, Templates, and Synonym Types</a></H3>
-
-
-    <p>
-      In C/C++ it is possible, via typedef, to have many names refer to
-      the same <tt>type</tt>. In general, this is not a problem, though
-      it can lead to confusion.  Assume the below C++ header file:
-    </p>
-
-    <div class="code">synonyms.h
-    <pre>
-class A { 
-  int x;
-  int y;
-};
-
-typedef A Foo;
-
-A *xxx(int i);         /* sets A-&gt;x = A-&gt;y = i */
-Foo *yyy(int i);       /* sets Foo-&gt;x = Foo-&gt;y = i */
-
-int zzz(A *inst = 0);  /* return inst-&gt;x + inst-&gt;y */
-    </pre>
-    </div>
-
-    <p>
-      The function <tt>zzz</tt> is an overloaded functions; the
-      foreign function call to it will be wrapped in a
-      generic-function whose argument will be checked against a type
-      of <tt>A</tt>. Assuming a simple implementation, a call
-      to <tt>xxx(1)</tt> will return a pointer to an A object, which
-      will be wrapped in a CLOS instance of class <tt>A</tt>, and a
-      call to <tt>yyy(1)</tt> will result in a CLOS instance of
-      type <tt>Foo</tt> being returned.  Without establishing a clear
-      type relationship between <tt>Foo</tt> and <tt>A</tt>, an
-      attempt to call <tt>zzz(yyy(1))</tt> will result in an error.
-    </p>
-
-    <p>
-      We resolve this issue, by noting synonym relationships between
-      types while generating the interface. A Primary type is selected
-      (more on this below) from the candidate list of synonyms. For
-      all other synonyms, instead of generating a distinct CLOS class
-      definition, we generate a form that expands to:
-    </p>
-      <div class="targetlang">
-        <tt>(setf (find-class &lt;synonym&gt;) &lt;primary&gt;)</tt>
-      </div>
-    <p>
-      The result is that all references to synonym types in foreign
-      code, are wrapped in the same CLOS wrapper, and, in particular,
-      method specialization in wrapping generic functions works as 
-      expected.
-    </p>
-
-    <p>
-      Given the above header file, synonym.h, a Lisp session would
-      appear as follows:
-    </p>
-    <div class="targetlang">
-    <pre>
-CL-USER&gt; (load "synonym.dll")
-; Foreign loading synonym.dll.
-t
-CL-USER&gt; (load "synonym.cl")
-; Loading c:\mikel\src\swig\test\synonym.cl
-t
-CL-USER&gt; 
-synonym&gt; (setf a (xxx 3))
-#&lt;A nil #x3261a0 @ #x207299da&gt;
-synonym&gt; (setf foo (yyy 10))
-#&lt;A nil #x3291d0 @ #x2072e982&gt;
-synonym&gt; (zzz a)
-6
-synonym&gt; (zzz foo)
-20
-synonym&gt; 
-    </pre>
-    </div>
-
-<H4><a name="Allegrocl_nn29">20.3.8.1 Choosing a primary type</a></H4>
-
-
-    <p>
-      The choice of a primary type is selected by the following
-      criteria from a set of synonym types.
-    </p>
-      <ul>
-        <li>
-        If a synonym type has a class definition, it is the primary type.
-        </li>
-        <li>
-        If a synonym type is a class template and has been explicitly
-        instantiated via <tt>%template</tt>, it is the primary type.
-        </li>
-        <li>
-        For all other sets of synonymous types, the synonym which is
-        parsed first becomes the primary type.
-        </li>
-      </ul>
-
-<H3><a name="Allegrocl_nn30">20.3.9 Function overloading/Parameter defaulting</a></H3>
-
-
-    <p>
-      For each possible argument combination, a distinct wrapper
-      function is created in the .cxx file. On the Lisp side, a
-      generic functions is defined for each possible arity the
-      overloaded/defaulted call may have. Each distinct wrapper is
-      then called from within a defmethod on the appropriate generic
-      function. These are further wrapped inside a dispatch function
-      that checks the number of arguments it is called with and passes
-      them via apply to the appropriate generic-function. This allows
-      for a single entry point to overloaded functions on the lisp
-      side.
-    </p>
-
-    <p>Example:
-    </p>
-    <div class="code">overload.h:
-    <pre>
-
-class A {
- public:
-  int x;
-  int y;
-};
-
-float xxx(int i, int x = 0);   /* return i * x */
-float xxx(A *inst, int x);     /* return x + A-&gt;x + A-&gt;y */
-    </pre>
-    </div>
-
-    <p>Creates the following three wrappers, for each of the possible argument
-      combinations
-    </p>
-    <div class="code">overload_wrap.cxx
-    <pre>
-EXPORT void ACL___delete_A__SWIG_0 (A *larg1) {
-  A *arg1 = (A *) 0 ;
-
-  arg1 = larg1;
-  try {
-    delete arg1;
-
-  } catch (...) {
-
-  }
-}
-
-
-EXPORT float ACL___xxx__SWIG_0 (int larg1, int larg2) {
-  float lresult = (float)0 ;
-  int arg1 ;
-  int arg2 ;
-  float result;
-
-  arg1 = larg1;
-  arg2 = larg2;
-  try {
-    result = (float)xxx(arg1, arg2);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (float)0;
-  }
-}
-
-
-EXPORT float ACL___xxx__SWIG_1 (int larg1) {
-  float lresult = (float)0 ;
-  int arg1 ;
-  float result;
-
-  arg1 = larg1;
-  try {
-    result = (float)xxx(arg1);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (float)0;
-  }
-}
-
-
-EXPORT float ACL___xxx__SWIG_2 (A *larg1, int larg2) {
-  float lresult = (float)0 ;
-  A *arg1 = (A *) 0 ;
-  int arg2 ;
-  float result;
-
-  arg1 = larg1;
-  arg2 = larg2;
-  try {
-    result = (float)xxx(arg1, arg2);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (float)0;
-  }
-}
-    </pre>
-    </div>
-
-    <p>
-      And the following foreign-function-call and method definitions on the
-      lisp side:
-    </p>
-    <div class="targetlang">overload.cl
-    <pre>
-(swig-defmethod ("xxx" "ACL___xxx__SWIG_0" :type :function :arity 2)
-  ((PARM0_i cl:integer :int )
-   (PARM1_x cl:integer :int ))
-  (:returning (:float )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_i))
-  (let ((SWIG_arg1 PARM1_x))
-  (swig-ff-call SWIG_arg0 SWIG_arg1))))
-
-(swig-defmethod ("xxx" "ACL___xxx__SWIG_1" :type :function :arity 1)
-  ((PARM0_i cl:integer :int ))
-  (:returning (:float )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_i))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-defmethod ("xxx" "ACL___xxx__SWIG_2" :type :function :arity 2)
-  ((PARM0_inst #.(swig-insert-id "A" () :type :class) (* #.(swig-insert-id "A" ())) )
-   (PARM1_x cl:integer :int ))
-  (:returning (:float )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_inst))
-  (let ((SWIG_arg1 PARM1_x))
-  (swig-ff-call SWIG_arg0 SWIG_arg1))))
-
-(swig-dispatcher ("xxx" :type :function :arities (1 2)))
-    </pre>
-    </div>
-
-    <p>And their usage in a sample lisp session:
-    </p>
-    <div class="targetlang">
-    <pre>
-overload&gt; (setf a (new_A))
-#&lt;A nil #x329268 @ #x206cf612&gt;
-overload&gt; (setf (A_x a) 10)
-10
-overload&gt; (setf (A_y a) 20)
-20
-overload&gt; (xxx 1)
-0.0
-overload&gt; (xxx 3 10)
-30.0
-overload&gt; (xxx a 1)
-31.0
-overload&gt; (xxx a 2)
-32.0
-overload&gt; 
-    </pre>
-    </div>
-
-<H3><a name="Allegrocl_nn31">20.3.10 Operator wrapping and Operator overloading</a></H3>
-
-
-    <p>
-      Wrappers to defined C++ Operators are automatically renamed, using
-      <tt>%rename</tt>, to the following defaults:
-    </p>
-    <div class="code">
-    <pre>
-/* name conversion for overloaded operators. */
-#ifdef __cplusplus
-%rename(__add__)             *::operator+;
-%rename(__pos__)             *::operator+();
-%rename(__pos__)             *::operator+() const;
-
-%rename(__sub__)             *::operator-;
-%rename(__neg__)             *::operator-() const;
-%rename(__neg__)             *::operator-();
-
-%rename(__mul__)             *::operator*;
-%rename(__deref__)           *::operator*();
-%rename(__deref__)           *::operator*() const;
-
-%rename(__div__)             *::operator/;
-%rename(__mod__)             *::operator%;
-%rename(__logxor__)          *::operator^;
-%rename(__logand__)          *::operator&amp;;
-%rename(__logior__)          *::operator|;
-%rename(__lognot__)          *::operator~();
-%rename(__lognot__)          *::operator~() const;
-
-%rename(__not__)             *::operator!();
-%rename(__not__)             *::operator!() const;
-
-%rename(__assign__)          *::operator=;
-
-%rename(__add_assign__)      *::operator+=;
-%rename(__sub_assign__)      *::operator-=;
-%rename(__mul_assign__)      *::operator*=;
-%rename(__div_assign__)      *::operator/=;
-%rename(__mod_assign__)      *::operator%=;
-%rename(__logxor_assign__)   *::operator^=;
-%rename(__logand_assign__)   *::operator&amp;=;
-%rename(__logior_assign__)   *::operator|=;
-
-%rename(__lshift__)          *::operator&lt;&lt;;
-%rename(__lshift_assign__)   *::operator&lt;&lt;=;
-%rename(__rshift__)          *::operator&gt;&gt;;
-%rename(__rshift_assign__)   *::operator&gt;&gt;=;
-
-%rename(__eq__)              *::operator==;
-%rename(__ne__)              *::operator!=;
-%rename(__lt__)              *::operator&lt;;
-%rename(__gt__)              *::operator&gt;;
-%rename(__lte__)             *::operator&lt;=;
-%rename(__gte__)             *::operator&gt;=;
-
-%rename(__and__)             *::operator&amp;&amp;;
-%rename(__or__)              *::operator||;
-
-%rename(__preincr__)         *::operator++();
-%rename(__postincr__)        *::operator++(int);
-%rename(__predecr__)         *::operator--();
-%rename(__postdecr__)        *::operator--(int);
-
-%rename(__comma__)           *::operator,();
-%rename(__comma__)           *::operator,() const;
-
-%rename(__member_ref__)      *::operator-&gt;;
-%rename(__member_func_ref__) *::operator-&gt;*;
-
-%rename(__funcall__)         *::operator();
-%rename(__aref__)            *::operator[];
-    </pre>
-    </div>
-
-    <p>
-      Name mangling occurs on all such renamed identifiers, so that wrapper name
-      generated by <tt>B::operator=</tt> will be <tt>B___eq__</tt>, i.e.
-      <tt>&lt;class-or-namespace&gt;_</tt> has been added. Users may modify
-      these default names by adding <tt>%rename</tt> directives in their own .i files.
-    </p>
-
-    <p>
-      Operator overloading can be achieved by adding functions based
-      on the mangled names of the function. In the following example,
-      a class B is defined with a Operator== method defined. The
-      swig <tt>%extend</tt> directive is used to add an overload method
-      on Operator==.
-    </p>
-
-    <div class="code">opoverload.h
-    <pre>
-class B {
- public:
-  int x;
-  int y;
-  bool operator==(B const&amp; other) const;
-};
-    </pre>
-    </div>
-
-    <p>
-    and
-    </p>
-    <div class="code">opoverload.i
-    <pre>
-%module opoverload
-
-%{
-#include &lt;fstream&gt;
-#include "opoverload.h"
-%}
-
-%{
-bool B___eq__(B const *inst, int const x)
-{
-  // insert the function definition into the wrapper code before
-  // the wrapper for it.
-  // ... do stuff ...
-}
-%}
-
-%include "opoverload.h"
-
-%extend B {
- public:
-  bool __eq__(int const x) const;
-};
-    </pre>
-    </div>
-
-    <p>
-      Either operator can be called via a single call
-      to the dispatch function:
-    </p>
-    <div class="targetlang">
-    <pre>
-opoverload&gt; (B___eq__ x1 x2)
-nil
-opoverload&gt; (B___eq__ x1 3)
-nil
-opoverload&gt; 
-    </pre>
-    </div>
-
-<H3><a name="Allegrocl_nn32">20.3.11 Varargs</a></H3>
-
-
-    <p>
-      Variable length argument lists are not supported, by default. If
-      such a function is encountered, a warning will generated to
-      stderr. Varargs are supported via the SWIG <tt>%varargs</tt>
-      directive. This directive allows you to specify a (finite)
-      argument list which will be inserted into the wrapper in place
-      of the variable length argument indicator.  As an example,
-      consider the function <tt>printf()</tt>. Its declaration would
-      appear as follows:
-    </p>
-
-    <p>
-      See the following section
-      on <a href="Varargs.html#Varargs">Variable Length arguments</a>
-      provides examples on how <tt>%varargs</tt> can be used, along
-      with other ways such functions can be wrapped.
-    </p>
-
-<H3><a name="Allegrocl_nn33">20.3.12 C++ Exceptions</a></H3>
-
-
-    <p>
-      Each C++ wrapper includes a handler to catch any exceptions that may
-      be thrown while in foreign code. This helps prevent simple C++ errors
-      from killing the entire lisp process. There is currently no mechanism
-      to have these exceptions forwarded to the lisp condition system, nor
-      has any explicit support of the exception related SWIG typemaps been
-      implemented.
-    </p>
-
-<H3><a name="Allegrocl_nn34">20.3.13 Pass by value, pass by reference</a></H3>
-
-
-    <p>
-      Allegro CL does not support the passing of non-primitive foreign
-      structures by value. As a result, SWIG must automatically detect
-      and convert function parameters and return values to pointers
-      whenever necessary. This is done via the use of <tt>typemaps</tt>,
-      and should not require any fine tuning by the user, even for
-      newly defined types.
-    </p>
-
-<H2><a name="Allegrocl_nn35">20.4 Typemaps</a></H2>
-
-
-<p>
-  SWIG Typemaps provide a powerful tool for automatically generating
-  code to handle various menial tasks required of writing an interface
-  to foreign code. The purpose of this section is to describe each of
-  the typemaps used by the Allegro CL module. Please read the chapter
-  on <a href="Typemaps.html#Typemaps">Typemaps</a> for more information.
-</p>
-
-<H3><a name="Allegrocl_nn36">20.4.1 Code Generation in the C++ Wrapper</a></H3>
-
-
-    
-    <p>
-      Every C++ wrapper generated by SWIG takes the following form:
-    </p>
-
-    <div class="diagram">
-    <pre>
-return-val wrapper-name(parm0, parm1, ..., parmN)
-{
-  return-val lresult;   /* return value from wrapper */
-  &lt;local-declaration&gt;
-  ... results;          /* return value from function call */
-
-  &lt;binding locals to parameters&gt;
-
-  try {
-    result = function-name(local0, local1, ..., localN);
-
-    &lt;convert and bind result to lresult&gt;
-
-    return lresult;
-  catch (...) {
-    return (int)0;
-  }
-    </pre>
-    </div>
-
-<H4><a name="Allegrocl_nn37">20.4.1.1 IN Typemap</a></H4>
-
-
-    <p>
-      the <tt>in</tt> typemap is used to generate code to convert parameters
-      passed to C++ wrapper functions into the arguments desired for the
-      call being wrapped. That is, it fills in the code for the 
-      <tt>&lt;binding locals to parameters&gt;</tt> section above. We
-      use this map to automatically convert parameters passed by
-      reference to the wrapper function into by-value arguments for
-      the wrapped call, and also to convert boolean values, which are
-      passed as integers from lisp (by default), into the appropriate
-      type for the language of code being wrapped.
-    </p>
-
-    <p>These are the default specifications for the IN typemap. Here,
-      <tt>$input</tt> refers to the parameter code is being generated
-      for, and <tt>$1</tt> is the local variable to which it is
-      being assigned. The default settings of this typemap are as follows:
-    </p>
-      
-    <div class="code">
-    <pre>
-%typemap(in) bool                          "$1 = (bool)$input;";
-%typemap(in) char, unsigned char, signed char,
-             short, signed short, unsigned short,
-             int, signed int, unsigned int,
-             long, signed long, unsigned long,
-             float, double, long double, char *, void *, void,
-             enum SWIGTYPE, SWIGTYPE *,
-             SWIGTYPE[ANY], SWIGTYPE &amp;     "$1 = $input;";
-%typemap(in) SWIGTYPE                      "$1 = *$input;";
-    </pre>
-    </div>
-
-<H4><a name="Allegrocl_nn38">20.4.1.2 OUT Typemap</a></H4>
-
-
-    <p>
-      The <tt>out</tt> typemap is used to generate code to form the
-      return value of the wrapper from the return value of the wrapped
-      function. This code is placed in the &lt;convert and bind result to lresult&gt;
-      section of the above code diagram. Its default mapping is as follows:
-    </p>
-
-    <div class="code">
-    <pre>
-%typemap(out) bool                          "$result = (int)$1;";
-%typemap(out) char, unsigned char, signed char,
-              short, signed short, unsigned short,
-              int, signed int, unsigned int,
-              long, signed long, unsigned long,
-              float, double, long double, char *, void *, void,
-              enum SWIGTYPE, SWIGTYPE *,
-              SWIGTYPE[ANY], SWIGTYPE &amp;    "$result = $1;";
-%typemap(out) SWIGTYPE                     "$result = new $1_type($1);";
-    </pre>
-    </div>
-
-<H4><a name="Allegrocl_nn39">20.4.1.3 CTYPE Typemap</a></H4>
-
-
-    <p>
-      This typemap is not used for code generation, but purely for the
-      transformation of types in the parameter list of the wrapper function.
-      Its primary use is to handle by-value to by-reference conversion in the
-      wrappers parameter list. Its default settings are:
-    </p>
-
-    <div class="code">
-    <pre>
-%typemap(ctype) bool                       "int";
-%typemap(ctype) char, unsigned char, signed char,
-                short, signed short, unsigned short,
-                int, signed int, unsigned int,
-                long, signed long, unsigned long,
-                float, double, long double, char *, void *, void,
-                enum SWIGTYPE, SWIGTYPE *,
-                SWIGTYPE[ANY], SWIGTYPE &amp;  "$1_ltype";
-%typemap(ctype) SWIGTYPE                   "$&amp;1_type";
-    </pre>
-    </div>
-
-    <p>
-      These three typemaps are specifically employed by the
-      Allegro CL interface generator. SWIG also implements a number of
-      other typemaps that can be used for generating code in the C/C++
-      wrappers. You can read about
-      these <a href="Typemaps.html#Typemaps_nn25">common typemaps</a> here.
-    </p>
-
-<H3><a name="Allegrocl_nn40">20.4.2 Code generation in Lisp wrappers</a></H3>
-
-
-    <p>
-      A number of custom typemaps have also been added to facilitate
-      the generation of code in the lisp side of the interface. These
-      are described below. The basic code generation structure is
-      applied as a series of nested expressions, one for each
-      parameter, then one for manipulating the return value, and last,
-      the foreign function call itself.
-    </p>
-
-    <p>
-      Note that the typemaps below use fully qualified symbols where
-      necessary. Users writing their own typemaps should do likewise. 
-      See the explanation in the last paragraph of 
-      <a href="#Allegrocl_nn15">16.3.1 Namespaces</a> for details.
-    </p>
-
-<H4><a name="Allegrocl_nn41">20.4.2.1 LIN Typemap</a></H4>
-
-
-    <p>
-      The LIN typemap allows for the manipulating the lisp objects
-      passed as arguments to the wrapping defun before passing them to
-      the foreign function call. For example, when passing lisp
-      strings to foreign code, it is often necessary to copy the
-      string into a foreign structure of type (:char *) of appropriate
-      size, and pass this copy to the foreign call. Using the LIN
-      typemap, one could arrange for the stack-allocation of a foreign
-      char array, copy your string into it, and not have to worry
-      about freeing the copy after the function returns. 
-    </p>
-
-    <p>The LIN typemap accepts the following <tt>$variable</tt> references.
-    </p>
-      <ul>
-        <li><tt>$in</tt> - expands to the name of the parameter being
-        applied to this typemap
-        </li>
-        <li><tt>$out</tt> - expands to the name of the local variable
-        assigned to this typemap
-        </li>
-        <li><tt>$in_fftype</tt> - the foreign function type of the C type.</li>
-        <li><tt>$*in_fftype</tt> - the foreign function type of the C type
-        with one pointer removed. If there is no pointer, then $*in_fftype
-        is the same as $in_fftype.
-        </li>
-        <li><tt>$body</tt> - very important. Instructs SWIG where
-        subsequent code generation steps should be inserted into the
-        current typemap.  Leaving out a <tt>$body</tt> reference
-        will result in lisp wrappers that do very little by way of
-        calling into foreign code. Not recommended.
-        </li>
-      </ul>
-      
-    <div class="code">
-    <pre>
-%typemap(lin) SWIGTYPE "(cl:let (($out $in))\n  $body)";
-    </pre>
-    </div>
-
-<H4><a name="Allegrocl_nn42">20.4.2.2 LOUT Typemap</a></H4>
-
-
-    <p>
-      The LOUT typemap is the means by which we effect the wrapping of
-      foreign pointers in CLOS instances. It is applied after all LIN
-      typemaps, and immediately before the actual foreign-call.
-    </p>
-
-    <p>The LOUT typemap uses the following $variable
-    </p>
-      <ul>
-        <li><tt>$lclass</tt> - Expands to the CLOS class that
-        represents foreign-objects of the return type matching this
-        typemap.
-        </li>
-        <li><tt>$body</tt> - Same as for the LIN map. Place this
-        variable where you want the foreign-function call to occur.
-        </li>
-        <li><tt>$ldestructor</tt> - Expands to the symbol naming the destructor for this
-        class ($lclass) of object. Allows you to insert finalization or automatic garbage
-        collection into the wrapper code (see default mappings below).
-        </li>
-      </ul>
-
-    <div class="code">
-    <pre>
-%typemap(lout) bool, char, unsigned char, signed char,
-               short, signed short, unsigned short,
-               int, signed int, unsigned int,
-               long, signed long, unsigned long,
-               float, double, long double, char *, void *, void,
-               enum SWIGTYPE    "$body";
-%typemap(lout) SWIGTYPE[ANY], SWIGTYPE *,
-               SWIGTYPE &amp;       "(cl:make-instance '$lclass :foreign-address $body)";
-%typemap(lout) SWIGTYPE    "(cl:let* ((address $body)\n
-                            (ACL_result (cl:make-instance '$lclass :foreign-address address)))\n
-                            (cl:unless (cl::zerop address)\n
-                            (excl:schedule-finalization ACL_result #'$ldestructor))\n
-                             ACL_result)";
-    </pre>
-    </div>
-
-<H4><a name="Allegrocl_nn43">20.4.2.3 FFITYPE Typemap</a></H4>
-
-
-    
-    <p>
-      The FFITYPE typemap works as a helper for a body of code that
-      converts C/C++ type specifications into Allegro CL foreign-type
-      specifications. These foreign-type specifications appear in
-      ff:def-foreing-type declarations, and in the argument list and
-      return values of ff:def-foreign-calls. You would modify this
-      typemap if you want to change how the FFI passes through
-      arguments of a given type. For example, if you know that a
-      particular compiler represents booleans as a single byte, you
-      might add an entry for:
-    </p>
-
-    <div class="code">
-    <pre>
-%typemap(ffitype) bool ":unsigned-char";
-    </pre>
-    </div>
-
-    <p>
-      Note that this typemap is pure type transformation, and is not
-      used in any code generations step the way the LIN and LOUT
-      typemaps are. The default mappings for this typemap are:
-    </p>
-
-    <div class="code">
-    <pre>
-%typemap(ffitype) bool ":int";
-%typemap(ffitype) char ":char";
-%typemap(ffitype) unsigned char ":unsigned-char";
-%typemap(ffitype) signed char ":char";
-%typemap(ffitype) short, signed short ":short";
-%typemap(ffitype) unsigned short ":unsigned-short";
-%typemap(ffitype) int, signed int ":int";
-%typemap(ffitype) unsigned int ":unsigned-int";
-%typemap(ffitype) long, signed long ":long";
-%typemap(ffitype) unsigned long ":unsigned-long";
-%typemap(ffitype) float ":float";
-%typemap(ffitype) double ":double";
-%typemap(ffitype) char * "(* :char)";
-%typemap(ffitype) void * "(* :void)";
-%typemap(ffitype) void ":void";
-%typemap(ffitype) enum SWIGTYPE ":int";
-%typemap(ffitype) SWIGTYPE &amp; "(* :void)";
-    </pre>
-    </div>
-
-<H4><a name="Allegrocl_nn44">20.4.2.4 LISPTYPE Typemap</a></H4>
-
-
-    <p>
-      This is another type only transformation map, and is used to
-      provide the lisp-type, which is the optional third argument in
-      argument specifier in a ff:def-foreign-call form. Specifying a
-      lisp-type allows the foreign call to perform type checking on
-      the arguments passed in. The default entries in this typemap are:
-    </p>
-
-    <div class="code">
-    <pre>
-%typemap(lisptype) bool "cl:boolean";
-%typemap(lisptype) char "cl:character";
-%typemap(lisptype) unsigned char "cl:integer";
-%typemap(lisptype) signed char "cl:integer";
-    </pre>
-    </div>
-
-<H4><a name="Allegrocl_nn45">20.4.2.5 LISPCLASS Typemap</a></H4>
-
-
-    <p>
-      The LISPCLASS typemap is used to generate the method signatures
-      for the generic-functions which wrap overloaded functions and
-      functions with defaulted arguments. The default entries are:
-    </p>
-
-    <div class="code">
-    <pre>
-%typemap(lispclass) bool "t";
-%typemap(lispclass) char "cl:character";
-%typemap(lispclass) unsigned char, signed char,
-                    short, signed short, unsigned short,
-                    int, signed int, unsigned int,
-                    long, signed long, unsigned long,
-                    enum SWIGTYPE       "cl:integer";
-%typemap(lispclass) float "cl:single-float";
-%typemap(lispclass) double "cl:double-float";
-%typemap(lispclass) char * "cl:string";
-    </pre>
-    </div>
-
-<H3><a name="Allegrocl_nn46">20.4.3 Modifying SWIG behavior using typemaps</a></H3>
-
-
-    <p>
-      The following example shows how we made use of the above
-      typemaps to add support for the wchar_t type. 
-    </p>
-
-    <div class="code">
-    <pre>
-%typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; };
-
-%typemap(in)        wchar_t "$1 = $input;";
-%typemap(lin)       wchar_t "(cl:let (($out (cl:char-code $in)))\n  $body)";
-%typemap(lin)       wchar_t* "(excl:with-native-string
-                                         ($out $in
-                                          :external-format #+little-endian :fat-le 
-                                                           #-little-endian :fat)\n
-                                 $body)"
-
-%typemap(out)       wchar_t "$result = $1;";
-%typemap(lout)      wchar_t "(cl:code-char $body)";
-%typemap(lout)      wchar_t* "(excl:native-to-string $body
-                                          :external-format #+little-endian :fat-le
-                                                           #-little-endian :fat)";
-
-%typemap(ffitype)   wchar_t ":unsigned-short";
-%typemap(lisptype)  wchar_t "";
-%typemap(ctype)     wchar_t "wchar_t";
-%typemap(lispclass) wchar_t "cl:character";
-%typemap(lispclass) wchar_t* "cl:string";
-    </pre>
-    </div>
-
-<H2><a name="Allegrocl_nn47">20.5 Identifier Converter functions</a></H2>
-
-
-<H3><a name="Allegrocl_nn48">20.5.1 Creating symbols in the lisp environment</a></H3>
-
-
-<p>
-  Various symbols must be generated in the lisp environment to which
-  class definitions, functions, constants, variables, etc. must be
-  bound. Rather than force a particular convention for naming these
-  symbols, an identifier (to symbol) conversion function is used. A
-  user-defined identifier-converter can then implement any symbol
-  naming, case-modifying, scheme desired.
-</p>
-
-<p>
-  In generated SWIG code, whenever some interface object must be
-  referenced by its lisp symbol, a macro is inserted that calls the
-  identifier-converter function to generate the appropriate symbol
-  reference. It is therefore expected that the identifier-converter
-  function reliably return the same (eq) symbol given the same set
-  of arguments.
-</p>
-
-<H3><a name="Allegrocl_nn49">20.5.2 Existing identifier-converter functions</a></H3>
-
-
-  <p>Two basic identifier routines have been defined.
-<H4><a name="Allegrocl_nn50">20.5.2.1 identifier-convert-null</a></H4>
-
-
-    <p>
-      No modification of the identifier string is performed. Based on
-      other arguments, the identifier may be concatenated with other
-      strings, from which a symbol will be created.
-    </p>
-
-<H4><a name="Allegrocl_nn51">20.5.2.2 identifier-convert-lispify</a></H4>
-
-
-    <p>
-      All underscores in the identifier string are converted to
-      hyphens. Otherwise, identifier-convert-lispify performs the
-      same symbol transformations.
-    </p>
-
-<H4><a name="Allegrocl_nn52">20.5.2.3 Default identifier to symbol conversions</a></H4>
-
-
-    <p>
-      Check the definitions of the above two default
-      identifier-converters in <tt>Lib/allegrocl/allegrocl.swg</tt> for
-      default naming conventions.
-    </p>
-
-<H3><a name="Allegrocl_nn53">20.5.3 Defining your own identifier-converter</a></H3>
-
-
-<p>
-  A user-defined identifier-converter function should conform to the following
-  specification:
-</p>
-
-<div class="targetlang">
-<pre>
-(defun identifier-convert-fn (id &amp;key type class arity) ...body...)
-result ==&gt; symbol or (setf symbol)
-</pre>
-</div>
-
-<p>The <tt>ID</tt> argument is a string representing an identifier in the
-foreign environment.
-</p>
-
-<p>
-The :type keyword argument provides more information on the type of
-identifier. Its value is a symbol. This allows the
-identifier-converter to apply different heuristics when mapping
-different types of identifiers to symbols. SWIG will generate calls
-to your identifier-converter using the following types.
-</p>
-
-<ul>
-  <li>:class - names a CLOS class.</li>
-  <li>:constant - names a defconstant</li>
-  <li>:constructor - names a function for creating a foreign object</li>
-  <li>:destructor - names a function for freeing a foreign object</li>
-  <li>:function - names a CLOS wrapping defmethod or defun.</li>
-  <li>:ff-operator - names a foreign call defined via ff:def-foreign-call</li>
-  <li>:getter - getter function</li>
-  <li>:namespace - names a C++ namespace</li>
-  <li>:setter - names a setter function. May return a (setf symbol) reference</li>
-  <li>:operator - names a C++ operator, such as Operator=, Operator*.</li>
-  <li>:slot - names a slot in a struct/class/union declaration.</li>
-  <li>:type - names a foreign-type defined via ff:def-foreign-type.</li>
-  <li>:variable - names a variable defined via ff:def-foreign-variable.</li>
-</ul>
-
-<p>
-The :class keyword argument is a string naming a foreign
-class. When non-nil, it indicates that the current identifier has
-scope in the specified class.
-</p>
-
-<p>
-The :arity keyword argument only appears in swig:swig-defmethod forms
-generated for overloaded functions. Its value is an integer
-indicating the number of arguments passed to the routine indicated by
-this identifier.
-</p>
-
-<H3><a name="Allegrocl_nn54">20.5.4 Instructing SWIG to use a particular identifier-converter</a></H3>
-
-
-<p>
-  By default, SWIG will use identifier-converter-null. To specify
-  another convert function, use the <tt>-identifier-converter</tt>
-  command-line argument. The value should be a string naming the
-  function you wish the interface to use instead, when generating
-  symbols. ex:
-</p>
-
-<div class="code">
-<pre>
-% swig -allegrocl -c++ -module mymodule -identifier-converter my-identifier-converter
-</pre>
-</div>
-
-
-</body>
-</html>
diff --git a/Examples/Makefile.in b/Examples/Makefile.in
index 16973c9..eeb7a25 100644
--- a/Examples/Makefile.in
+++ b/Examples/Makefile.in
@@ -1251,46 +1251,6 @@
 	rm -f *.@OBJEXT@ *$(LUA_SO)
 
 ##################################################################
-#####                   ALLEGRO CL                          ######
-##################################################################
-
-ALLEGROCL    = @ALLEGROCLBIN@
-ALLEGROCL_SCRIPT=$(RUNME).lisp
-
-allegrocl: $(SRCDIR_SRCS)
-	$(SWIG) -allegrocl -cwrap $(SWIGOPT) -o $(ISRCS) $(INTERFACEPATH)
-	$(CC) -c $(CCSHARED) $(CPPFLAGS) $(CFLAGS) $(ISRCS) $(INCLUDES) $(SRCDIR_SRCS)
-	$(LDSHARED) $(CFLAGS) $(LDFLAGS) $(OBJS) $(IOBJS) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(SO)
-
-allegrocl_cpp: $(SRCDIR_SRCS)
-	$(SWIG) -c++ -allegrocl $(SWIGOPT) -o $(ICXXSRCS) $(INTERFACEPATH)
-	$(CXX) -c $(CCSHARED) $(CPPFLAGS) $(CXXFLAGS) $(ICXXSRCS) $(SRCDIR_SRCS) $(SRCDIR_CXXSRCS) $(INCLUDES)
-	$(CXXSHARED) $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(IOBJS) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(SO)
-
-# -----------------------------------------------------------------
-# Run ALLEGRO CL example
-# -----------------------------------------------------------------
-
-allegrocl_run:
-	$(RUNTOOL) $(ALLEGROCL) -batch -s $(ALLEGROCL_SCRIPT) $(RUNPIPE)
-
-# -----------------------------------------------------------------
-# Version display
-# -----------------------------------------------------------------
-
-allegrocl_version:
-	$(ALLEGROCL) --version
-
-# -----------------------------------------------------------------
-# Cleaning the ALLEGRO CL examples
-# -----------------------------------------------------------------
-
-allegrocl_clean:
-	rm -f *_wrap* *~ .~*
-	rm -f core @EXTRA_CLEAN@
-	rm -f *.@OBJEXT@ *@SO@
-
-##################################################################
 #####                      CFFI                             ######
 ##################################################################
 
diff --git a/Examples/test-suite/allegrocl/Makefile.in b/Examples/test-suite/allegrocl/Makefile.in
deleted file mode 100644
index b13d546..0000000
--- a/Examples/test-suite/allegrocl/Makefile.in
+++ /dev/null
@@ -1,126 +0,0 @@
-#######################################################################
-# Makefile for allegrocl test-suite
-#######################################################################
-
-LANGUAGE     = allegrocl
-ALLEGROCL    = @ALLEGROCLBIN@
-SCRIPTSUFFIX = _runme.lisp
-
-srcdir       = @srcdir@
-top_srcdir   = @top_srcdir@
-top_builddir = @top_builddir@
-
-
-# these cpp tests generate warnings/errors when compiling
-# the wrapper .cxx file.
-CPP_TEST_BROKEN_CXX =
-# the error is wrap:action code generated by swig. \
-# error: can't convert [std::string] 'b' to 'bool' \
-# might just need a bool overload op for std::string. \
-	global_vars \
-# same as w/ global_vars but with more errors in cxx file \
-	naturalvar \
-
-# these cpp tests aren't working. Fix 'em
-# need to further separate these into tests requiring
-# std libraries, or the $ldestructor problem.
-CPP_TEST_BROKEN_ACL = \
-	contract \
-	allprotected \
-# 'throws' typemap entries. \
-	cplusplus_throw \
-# 'throws' typemap entries. \
-	default_args \
-# missing typemaps. suspect module support needed \
-	dynamic_cast \
-	extend_variable \
-# cdata.i support needed \
-	li_cdata_cpp \
-# warning generated. otherwise all good. \
-	operator_overload \
-# std_common.i support \
-	sizet \
-# std_vector.i support. \
-	template_default \
-# *** line 31. can't copy typemap?? \
-	typemap_namespace \
-
-# these aren't working due to longlong support. (low hanging fruit)
-CPP_TEST_BROKEN_LONGLONG = \
-	arrays_dimensionless \
-	arrays_global \
-	arrays_global_twodim \
-	li_typemaps \
-	li_windows \
-	long_long_apply \
-	primitive_ref \
-	reference_global_vars \
-	template_default_arg
-
-# These are currently unsupported.
-CPP_TEST_CASES_ACL_UNSUPPORTED = \
-# contract support \
-	aggregate \
-# directors support \
-	apply_signed_char \
-# contract support \
-	contract \
-	director_exception \
-	director_protected \
-	exception_order \
-# 'throws' typemap support \
-	extern_throws \
-	throw_exception \
-	using_pointers \
-
-C_TEST_CASES_ACL_BROKEN = \
-# 'cdate.i' module support \
-	li_cdata \
-# adding an existing type defnition... \
-	typedef_struct \
-# swigrun.swg support. \
-	typemap_subst
-
-C_TEST_BROKEN_LONGLONG = \
-	long_long
-
-
-# std lib support hasn't been done yet.
-SKIP_CPP_STD_CASES = Yes
-
-include $(srcdir)/../common.mk
-
-# Overridden variables here
-# SWIGOPT += -debug-module 4
-
-# Custom tests - tests with additional commandline options
-# none!
-
-# Rules for the different types of tests
-%.cpptest:
-	$(setup)
-	+$(swig_and_compile_cpp)
-	$(run_testcase)
-
-%.ctest:
-	$(setup)
-	+$(swig_and_compile_c)
-	$(run_testcase)
-
-%.multicpptest:
-	$(setup)
-	+$(swig_and_compile_multi_cpp)
-	$(run_testcase)
-
-# Runs the testcase. A testcase is only run if
-# a file is found which has _runme.lisp appended after the testcase name.
-run_testcase = \
-	if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \
-	  env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH $(RUNTOOL) $(ALLEGROCLBIN) -batch -s $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
-	fi
-
-%.clean:
-	@rm -f $*.cl
-
-clean:
-	$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR="$(SRCDIR)" allegrocl_clean
diff --git a/Lib/allegrocl/allegrocl.swg b/Lib/allegrocl/allegrocl.swg
deleted file mode 100644
index 524aa7c..0000000
--- a/Lib/allegrocl/allegrocl.swg
+++ /dev/null
@@ -1,615 +0,0 @@
-/* Define a C preprocessor symbol that can be used in interface files
-   to distinguish between the SWIG language modules. */ 
-
-#define SWIG_ALLEGRO_CL
-
-#define %ffargs(...) %feature("ffargs", "1", ##__VA_ARGS__)
-%ffargs(strings_convert="t");
-
-/* typemaps for argument and result type conversions. */
-%typemap(lin,numinputs=1)	SWIGTYPE 	"(cl::let (($out $in))\n  $body)";
-
-%typemap(lout) bool, char, unsigned char, signed char,
-               short, signed short, unsigned short,
-               int, signed int, unsigned int,
-               long, signed long, unsigned long,
-               float, double, long double, char *, void *,
-               enum SWIGTYPE    "(cl::setq ACL_ffresult $body)";
-%typemap(lout) void "$body";
-#ifdef __cplusplus
-%typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&
-%{ (cl:let* ((address $body)
-	  (new-inst (cl:make-instance '$lclass :foreign-address address)))
-     (cl:when (cl:and $owner (cl:not (cl:zerop address)))
-       (excl:schedule-finalization new-inst #'$ldestructor))
-     (cl:setq ACL_ffresult new-inst)) %}
-
-%typemap(lout) SWIGTYPE         "(cl::let* ((address $body)\n         (new-inst (cl::make-instance '$lclass :foreign-address address)))\n    (cl::unless (cl::zerop address)\n      (excl:schedule-finalization new-inst #'$ldestructor))\n    (cl::setq ACL_ffresult new-inst))";
-#else
-%typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE
-%{ (cl:let* ((address $body)
-	  (new-inst (cl:make-instance '$lclass :foreign-address address)))
-     (cl:setq ACL_ffresult new-inst)) %}
-#endif
-
-%typemap(lisptype) bool, const bool "cl:boolean";
-%typemap(lisptype) char, const char "cl:character";
-%typemap(lisptype) unsigned char, const unsigned char "cl:integer";
-%typemap(lisptype) signed char, const signed char "cl:integer";
-
-%typemap(ffitype) bool, const bool ":int";
-%typemap(ffitype) char, const char,
-		  signed char, const signed char ":char";
-%typemap(ffitype) unsigned char, const unsigned char ":unsigned-char";
-%typemap(ffitype) short, const short,
-		  signed short, const signed short ":short";
-%typemap(ffitype) unsigned short, const unsigned short ":unsigned-short";
-%typemap(ffitype) int, const int, signed int, const signed int ":int";
-%typemap(ffitype) unsigned int, const unsigned int ":unsigned-int";
-%typemap(ffitype) long, const long, signed long, const signed long ":long";
-%typemap(ffitype) unsigned long, const unsigned long ":unsigned-long";
-%typemap(ffitype) float, const float ":float";
-%typemap(ffitype) double, const double ":double";
-%typemap(ffitype) char *, const char *, signed char *,
-		  const signed char *, signed char &,
-		  const signed char &			 "(* :char)";
-%typemap(ffitype) unsigned char *, const unsigned char *,
-		  unsigned char &, const unsigned char & "(* :unsigned-char)";
-%typemap(ffitype) short *, const short *, short &,
-		  const short &				"(* :short)";
-%typemap(ffitype) unsigned short *, const unsigned short *,
-		  unsigned short &, const unsigned short & "(* :unsigned-short)";
-%typemap(ffitype) int *, const int *, int &, const int & "(* :int)";
-%typemap(ffitype) unsigned int *, const unsigned int *,
-		  unsigned int &, const unsigned int &	"(* :unsigned-int)";
-%typemap(ffitype) void * "(* :void)";
-%typemap(ffitype) void ":void";
-%typemap(ffitype) enum SWIGTYPE ":int";
-%typemap(ffitype) SWIGTYPE & "(* :void)";
-%typemap(ffitype) SWIGTYPE && "(* :void)";
-
-/* const typemaps
-idea: marshall all primitive c types to their respective lisp types
-to maintain const corretness. For pointers/references, all bets
-are off if you try to modify them.
-
-idea: add a constant-p slot to the base foreign-pointer class. For
-constant pointer/references check this value when setting (around method?)
-and error if a setf operation is performed on the address of this object.
-
-*/
-
-/* 
-%exception %{
-   try {
-      $action
-   } catch (...) {
-      return $null;
-   }
-%}
-
-*/
-
-// %typemap(throws) SWIGTYPE {
-//   (void)$1;
-//   SWIG_fail;
-// }
-
-%typemap(ctype) bool, const bool		"int";
-%typemap(ctype) char, unsigned char, signed char,
-                short, signed short, unsigned short,
-                int, signed int, unsigned int,
-                long, signed long, unsigned long,
-                float, double, long double, char *, void *, void,
-                enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[],
-                SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE &&, const SWIGTYPE  "$1_ltype";
-%typemap(ctype) SWIGTYPE                   "$&1_type";
-
-%typemap(in) bool                          "$1 = (bool)$input;";
-%typemap(in) char, unsigned char, signed char,
-             short, signed short, unsigned short,
-             int, signed int, unsigned int,
-             long, signed long, unsigned long,
-             float, double, long double, char *, void *, void,
-             enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[],
-             SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1 = $input;";
-%typemap(in) SWIGTYPE                      "$1 = *$input;";
-
-/* We don't need to do any actual C-side typechecking, but need to
-   use the precedence values to choose which overloaded function
-   interfaces to generate when conflicts arise. */
-
-/* predefined precedence values
-
-Symbolic Name                   Precedence Value
-------------------------------  ------------------
-SWIG_TYPECHECK_POINTER           0  
-SWIG_TYPECHECK_VOIDPTR           10 
-SWIG_TYPECHECK_BOOL              15 
-SWIG_TYPECHECK_UINT8             20 
-SWIG_TYPECHECK_INT8              25 
-SWIG_TYPECHECK_UINT16            30 
-SWIG_TYPECHECK_INT16             35 
-SWIG_TYPECHECK_UINT32            40 
-SWIG_TYPECHECK_INT32             45 
-SWIG_TYPECHECK_UINT64            50 
-SWIG_TYPECHECK_INT64             55 
-SWIG_TYPECHECK_UINT128           60 
-SWIG_TYPECHECK_INT128            65 
-SWIG_TYPECHECK_INTEGER           70 
-SWIG_TYPECHECK_FLOAT             80 
-SWIG_TYPECHECK_DOUBLE            90 
-SWIG_TYPECHECK_COMPLEX           100 
-SWIG_TYPECHECK_UNICHAR           110 
-SWIG_TYPECHECK_UNISTRING         120 
-SWIG_TYPECHECK_CHAR              130 
-SWIG_TYPECHECK_STRING            140 
-SWIG_TYPECHECK_BOOL_ARRAY        1015 
-SWIG_TYPECHECK_INT8_ARRAY        1025 
-SWIG_TYPECHECK_INT16_ARRAY       1035 
-SWIG_TYPECHECK_INT32_ARRAY       1045 
-SWIG_TYPECHECK_INT64_ARRAY       1055 
-SWIG_TYPECHECK_INT128_ARRAY      1065 
-SWIG_TYPECHECK_FLOAT_ARRAY       1080 
-SWIG_TYPECHECK_DOUBLE_ARRAY      1090 
-SWIG_TYPECHECK_CHAR_ARRAY        1130 
-SWIG_TYPECHECK_STRING_ARRAY      1140
-*/
-
-%typecheck(SWIG_TYPECHECK_BOOL) bool { $1 = 1; };
-%typecheck(SWIG_TYPECHECK_CHAR) char { $1 = 1; };
-%typecheck(SWIG_TYPECHECK_FLOAT) float { $1 = 1; };
-%typecheck(SWIG_TYPECHECK_DOUBLE) double { $1 = 1; };
-%typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; };
-%typecheck(SWIG_TYPECHECK_INTEGER)
-                    unsigned char, signed char,
-                    short, signed short, unsigned short,
-                    int, signed int, unsigned int,
-                    long, signed long, unsigned long,
-                    enum SWIGTYPE { $1 = 1; };
-%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&,
-				   SWIGTYPE[], SWIGTYPE[ANY],
-				   SWIGTYPE { $1 = 1; };
-
-/* This maps C/C++ types to Lisp classes for overload dispatch */
-
-%typemap(lispclass) bool "t";
-%typemap(lispclass) char "cl:character";
-%typemap(lispclass) unsigned char, signed char,
-                    short, signed short, unsigned short,
-                    int, signed int, unsigned int,
-                    long, signed long, unsigned long,
-                    enum SWIGTYPE       "cl:integer";
-%typemap(lispclass) float "cl:single-float";
-%typemap(lispclass) double "cl:double-float";
-%typemap(lispclass) char * "cl:string";
-
-%typemap(out) void                          "";
-%typemap(out) bool                          "$result = (int)$1;";
-%typemap(out) char, unsigned char, signed char,
-              short, signed short, unsigned short,
-              int, signed int, unsigned int,
-              long, signed long, unsigned long,
-              float, double, long double, char *, void *,
-              enum SWIGTYPE, SWIGTYPE *,
-              SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$result = $1;";
-#ifdef __cplusplus
-%typemap(out) SWIGTYPE                     "$result = new $1_ltype($1);";
-#else
-%typemap(out) SWIGTYPE {
-  $result = ($&1_ltype) malloc(sizeof($1_type));
-  memmove($result, &$1, sizeof($1_type));
-}
-#endif
-
-//////////////////////////////////////////////////////////////
-// UCS-2 string conversion
-
-// should this be SWIG_TYPECHECK_CHAR?
-%typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; };
-
-%typemap(in)        wchar_t "$1 = $input;";
-%typemap(lin,numinputs=1)       wchar_t "(cl::let (($out (cl:char-code $in)))\n  $body)";
-%typemap(lin,numinputs=1)       wchar_t * "(excl:with-native-string ($out $in
-:external-format #+little-endian :fat-le #-little-endian :fat)\n
-$body)"
-
-%typemap(out)       wchar_t "$result = $1;";
-%typemap(lout)      wchar_t "(cl::setq ACL_ffresult (cl::code-char $body))";
-%typemap(lout)      wchar_t * "(cl::setq ACL_ffresult (excl:native-to-string $body
-:external-format #+little-endian :fat-le #-little-endian :fat))";
-
-%typemap(ffitype)   wchar_t ":unsigned-short";
-%typemap(lisptype)  wchar_t "";
-%typemap(ctype)     wchar_t "wchar_t";
-%typemap(lispclass) wchar_t "cl:character";
-%typemap(lispclass) wchar_t * "cl:string";
-//////////////////////////////////////////////////////////////
-
-/* Array reference typemaps */
-%apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) }
-%apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) }
-
-/* const pointers */
-%apply SWIGTYPE * { SWIGTYPE *const }
-%apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) }
-%apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) }
-
-/* name conversion for overloaded operators. */
-#ifdef __cplusplus
-%rename(__add__)	     *::operator+;
-%rename(__pos__)	     *::operator+();
-%rename(__pos__)	     *::operator+() const;
-
-%rename(__sub__)	     *::operator-;
-%rename(__neg__)	     *::operator-() const;
-%rename(__neg__)	     *::operator-();
-
-%rename(__mul__)	     *::operator*;
-%rename(__deref__)	     *::operator*();
-%rename(__deref__)	     *::operator*() const;
-
-%rename(__div__)	     *::operator/;
-%rename(__mod__)	     *::operator%;
-%rename(__logxor__)	     *::operator^;
-%rename(__logand__)	     *::operator&;
-%rename(__logior__)	     *::operator|;
-%rename(__lognot__)	     *::operator~();
-%rename(__lognot__)	     *::operator~() const;
-
-%rename(__not__)	     *::operator!();
-%rename(__not__)	     *::operator!() const;
-
-%rename(__assign__)	     *::operator=;
-
-%rename(__add_assign__)      *::operator+=;
-%rename(__sub_assign__)	     *::operator-=;
-%rename(__mul_assign__)	     *::operator*=;
-%rename(__div_assign__)	     *::operator/=;
-%rename(__mod_assign__)	     *::operator%=;
-%rename(__logxor_assign__)   *::operator^=;
-%rename(__logand_assign__)   *::operator&=;
-%rename(__logior_assign__)   *::operator|=;
-
-%rename(__lshift__)	     *::operator<<;
-%rename(__lshift_assign__)   *::operator<<=;
-%rename(__rshift__)	     *::operator>>;
-%rename(__rshift_assign__)   *::operator>>=;
-
-%rename(__eq__)		     *::operator==;
-%rename(__ne__)		     *::operator!=;
-%rename(__lt__)		     *::operator<;
-%rename(__gt__)		     *::operator>;
-%rename(__lte__)	     *::operator<=;
-%rename(__gte__)	     *::operator>=;
-
-%rename(__and__)	     *::operator&&;
-%rename(__or__)		     *::operator||;
-
-%rename(__preincr__)	     *::operator++();
-%rename(__postincr__)	     *::operator++(int);
-%rename(__predecr__)	     *::operator--();
-%rename(__postdecr__)	     *::operator--(int);
-
-%rename(__comma__)	     *::operator,();
-%rename(__comma__)	     *::operator,() const;
-
-%rename(__member_ref__)      *::operator->;
-%rename(__member_func_ref__) *::operator->*;
-
-%rename(__funcall__)	     *::operator();
-%rename(__aref__)	     *::operator[];
-
-%rename(__bool__)	     *::operator bool();
-%rename(__bool__)	     *::operator bool() const;
-#endif
-
-%insert("lisphead") %{
-(eval-when (:compile-toplevel :load-toplevel :execute)
-
-  ;; avoid compiling ef-templates at runtime
-  (excl:find-external-format :fat)
-  (excl:find-external-format :fat-le)
-
-;;; You can define your own identifier converter if you want.
-;;; Use the -identifier-converter command line argument to
-;;; specify its name.
-
-(eval-when (:compile-toplevel :load-toplevel :execute)
-   (cl::defparameter *swig-export-list* nil))
-
-(cl::defconstant *void* :..void..)
-
-;; parsers to aid in finding SWIG definitions in files.
-(cl::defun scm-p1 (form)
-  (let* ((info (cl::second form))
-	 (id (car info))
-	 (id-args (if (eq (cl::car form) 'swig-dispatcher)
-		      (cl::cdr info)
-		      (cl::cddr info))))
-    (cl::apply *swig-identifier-converter* id 
-	   (cl::progn (cl::when (cl::eq (cl::car form) 'swig-dispatcher)
-		    (cl::remf id-args :arities))
-		  id-args))))
-
-(cl::defmacro defswig1 (name (&rest args) &body body)
-  `(cl::progn (cl::defmacro ,name ,args
-	    ,@body)
-	  (excl::define-simple-parser ,name scm-p1)) )
-
-(cl::defmacro defswig2 (name (&rest args) &body body)
-  `(cl::progn (cl::defmacro ,name ,args
-	    ,@body)
-	  (excl::define-simple-parser ,name second)))
-
-(defun read-symbol-from-string (string)
-  (cl::multiple-value-bind (result position)
-      (cl::read-from-string string nil "eof" :preserve-whitespace t)
-    (cl::if (cl::and (cl::symbolp result)
-    	             (cl::eql position (cl::length string)))
-        result
-	(cl::multiple-value-bind (sym)
-	    (cl::intern string)
-	  sym))))
-
-(cl::defun full-name (id type arity class)
-  ; We need some kind of a hack here to handle template classes
-  ; and other synonym types right. We need the original name.
-  (let*( (sym (read-symbol-from-string 
-                (if (eq *swig-identifier-converter* 'identifier-convert-lispify)
-                  (string-lispify id)
-                  id)))
-         (sym-class (find-class sym nil))
-         (id (cond ( (not sym-class)
-                     id )
-                   ( (and sym-class
-                          (not (eq (class-name sym-class)
-                                sym)))
-                     (class-name sym-class) )
-                   ( t
-                     id ))) )
-    (cl::case type
-      (:getter (cl::format nil "~@[~A_~]~A" class id))
-      (:constructor (cl::format nil "new_~A~@[~A~]" id arity))
-      (:destructor (cl::format nil "delete_~A" id))
-      (:type (cl::format nil "ff_~A" id))
-      (:slot id)
-      (:ff-operator (cl::format nil "ffi_~A" id))
-      (otherwise (cl::format nil "~@[~A_~]~A~@[~A~]"
-                         class id arity)))))
-  
-(cl::defun identifier-convert-null (id &key type class arity)
-  (cl::if (cl::eq type :setter)
-      `(cl::setf ,(identifier-convert-null
-               id :type :getter :class class :arity arity))
-      (read-symbol-from-string (full-name id type arity class))))
-
-(cl::defun string-lispify (str)
-  (cl::let ( (cname (excl::replace-regexp str "_" "-"))
-             (lastcase :other)
-             newcase char res ) 
-    (cl::dotimes (n (cl::length cname))
-      (cl::setf char (cl::schar cname n))
-      (excl::if* (cl::alpha-char-p char)
-         then
-              (cl::setf newcase (cl::if (cl::upper-case-p char) :upper :lower))
-              (cl::when (cl::and (cl::eq lastcase :lower)
-                                 (cl::eq newcase :upper))
-                ;; case change... add a dash
-                (cl::push #\- res)
-                (cl::setf newcase :other))
-              (cl::push (cl::char-downcase char) res)
-              (cl::setf lastcase newcase)
-         else
-              (cl::push char res)
-              (cl::setf lastcase :other)))
-    (cl::coerce (cl::nreverse res) 'string)))
-  
-(cl::defun identifier-convert-lispify (cname &key type class arity)
-  (cl::assert (cl::stringp cname))
-  (cl::when (cl::eq type :setter)
-    (cl::return-from identifier-convert-lispify
-      `(cl::setf ,(identifier-convert-lispify
-               cname :type :getter :class class :arity arity))))
-  (cl::setq cname (full-name cname type arity class))
-  (cl::if (cl::eq type :constant)
-      (cl::setf cname (cl::format nil "*~A*" cname)))
-  (read-symbol-from-string (string-lispify cname)))
-
-(cl::defun id-convert-and-export (name &rest kwargs)
-  (cl::multiple-value-bind (symbol package)
-      (cl::apply *swig-identifier-converter* name kwargs)
-    (cl::let ((args (cl::list (cl::if (cl::consp symbol)
-    	     	    	         (cl::cadr symbol) symbol)
-                      (cl::or package cl::*package*))))
-      (cl::apply #'cl::export args)
-      (cl::pushnew args *swig-export-list*))
-    symbol))
-
-(cl::defmacro swig-insert-id (name namespace &key (type :type) class)
-  `(cl::let ((cl::*package* (cl::find-package ,(package-name-for-namespace namespace))))
-    (id-convert-and-export ,name :type ,type :class ,class)))
-
-(defswig2 swig-defconstant (string value)
-  (cl::let ((symbol (id-convert-and-export string :type :constant)))
-    `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-       (cl::defconstant ,symbol ,value))))
-
-(cl::defun maybe-reorder-args (funcname arglist)
-  ;; in the foreign setter function the new value will be the last argument
-  ;; in Lisp it needs to be the first
-  (cl::if (cl::consp funcname)
-      (cl::append (cl::last arglist) (cl::butlast arglist))
-      arglist))
-
-(cl::defun maybe-return-value (funcname arglist)
-  ;; setf functions should return the new value
-  (cl::when (cl::consp funcname)
-    `(,(cl::if (cl::consp (cl::car arglist))
-           (cl::caar arglist)
-           (cl::car arglist)))))
-
-(cl::defun swig-anyvarargs-p (arglist)
-  (cl::member :SWIG__varargs_ arglist))
-
-(defswig1 swig-defun ((name &optional (mangled-name name)
-                            &key (type :operator) class arity)
-                      arglist kwargs
-		      &body body)
-  (cl::let* ((symbol (id-convert-and-export name :type type
-                          :arity arity :class class))
-             (mangle (excl::if* (cl::string-equal name mangled-name)
-                      then (id-convert-and-export 
-				    (cl::cond
-					  ((cl::eq type :setter) (cl::format nil "~A-set" name))
-					  ((cl::eq type :getter) (cl::format nil "~A-get" name))
-					  (t name))
-				    :type :ff-operator :arity arity :class class)
-                      else (cl::intern mangled-name)))
-         (defun-args (maybe-reorder-args
-                      symbol
-		      (cl::mapcar #'cl::car (cl::and (cl::not (cl::equal arglist '(:void)))
-					 (cl::loop as i in arglist
-					       when (cl::eq (cl::car i) :p+)
-					       collect (cl::cdr i))))))
-	 (ffargs (cl::if (cl::equal arglist '(:void))
-	 	      arglist
-		    (cl::mapcar #'cl::cdr arglist)))
-	 )
-    (cl::when (swig-anyvarargs-p ffargs)
-      (cl::setq ffargs '()))
-    `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-       (excl::compiler-let ((*record-xref-info* nil))
-         (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs))
-       (cl::macrolet ((swig-ff-call (&rest args)
-                      (cl::cons ',mangle args)))
-         (cl::defun ,symbol ,defun-args
-           ,@body
-           ,@(maybe-return-value symbol defun-args))))))
-
-(defswig1 swig-defmethod ((name &optional (mangled-name name)
-	  	                &key (type :operator) class arity)
-                          ffargs kwargs
-                          &body body)
-  (cl::let* ((symbol (id-convert-and-export name :type type
-                          :arity arity :class class))
-         (mangle (cl::intern mangled-name))
-         (defmethod-args (maybe-reorder-args
-                          symbol
-                          (cl::unless (cl::equal ffargs '(:void))
-                            (cl::loop for (lisparg name dispatch) in ffargs
-			    	  when (eq lisparg :p+)
-                                  collect `(,name ,dispatch)))))
-         (ffargs (cl::if (cl::equal ffargs '(:void))
-                     ffargs
-                     (cl::loop for (nil name nil . ffi) in ffargs
-                           collect `(,name ,@ffi)))))
-    `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-       (excl::compiler-let ((*record-xref-info* nil))
-         (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs))
-       (cl::macrolet ((swig-ff-call (&rest args)
-                      (cl::cons ',mangle args)))
-         (cl::defmethod ,symbol ,defmethod-args
-           ,@body
-           ,@(maybe-return-value symbol defmethod-args))))))
-
-(defswig1 swig-dispatcher ((name &key (type :operator) class arities))
-  (cl::let ((symbol (id-convert-and-export name
-                         :type type :class class)))
-    `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-       (cl::defun ,symbol (&rest args)
-         (cl::case (cl::length args)
-           ,@(cl::loop for arity in arities
-                   for symbol-n = (id-convert-and-export name
-                                           :type type :class class :arity arity)
-                   collect `(,arity (cl::apply #',symbol-n args)))
-	   (t (cl::error "No applicable wrapper-methods for foreign call ~a with args ~a of classes ~a" ',symbol args (cl::mapcar #'(cl::lambda (x) (cl::class-name (cl::class-of x))) args)))
-	   )))))
-
-(defswig2 swig-def-foreign-stub (name)
-  (cl::let ((lsymbol (id-convert-and-export name :type :class))
-	    (symbol (id-convert-and-export name :type :type)))
-    `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-	(ff:def-foreign-type ,symbol (:class ))
-	(cl::defclass ,lsymbol (ff:foreign-pointer) ()))))
-
-(defswig2 swig-def-foreign-class (name supers &rest rest)
-  (cl::let ((lsymbol (id-convert-and-export name :type :class))
-	    (symbol (id-convert-and-export name :type :type)))
-    `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-       (ff:def-foreign-type ,symbol ,@rest)
-       (cl::defclass ,lsymbol ,supers
-	 ((foreign-type :initform ',symbol :initarg :foreign-type
-			:accessor foreign-pointer-type))))))
-
-(defswig2 swig-def-foreign-type (name &rest rest)
-  (cl::let ((symbol (id-convert-and-export name :type :type)))
-    `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-       (ff:def-foreign-type ,symbol ,@rest))))
-
-(defswig2 swig-def-synonym-type (synonym of ff-synonym)
-  `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-     (cl::setf (cl::find-class ',synonym) (cl::find-class ',of))
-     (ff:def-foreign-type ,ff-synonym (:struct ))))
-
-(cl::defun package-name-for-namespace (namespace)
-  (excl::list-to-delimited-string
-   (cl::cons *swig-module-name*
-         (cl::mapcar #'(cl::lambda (name)
-                     (cl::string
-                      (cl::funcall *swig-identifier-converter*
-                               name
-                               :type :namespace)))
-                 namespace))
-   "."))
-
-(cl::defmacro swig-defpackage (namespace)
-  (cl::let* ((parent-namespaces (cl::maplist #'cl::reverse (cl::cdr (cl::reverse namespace))))
-             (parent-strings (cl::mapcar #'package-name-for-namespace
-                                 parent-namespaces))
-             (string (package-name-for-namespace namespace)))
-    `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-      (cl::defpackage ,string
-        (:use :swig :ff #+ignore '(:common-lisp :ff :excl)
-              ,@parent-strings ,*swig-module-name*)
-	(:import-from :cl :* :nil :t)))))
-
-(cl::defmacro swig-in-package (namespace)
-  `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-    (cl::in-package ,(package-name-for-namespace namespace))))
-
-(defswig2 swig-defvar (name mangled-name &key type (ftype :unsigned-natural))
-  (cl::let ((symbol (id-convert-and-export name :type type)))
-    `(cl::eval-when (:compile-toplevel :load-toplevel :execute)
-      (ff:def-foreign-variable (,symbol ,mangled-name) :type ,ftype))))
-
-) ;; eval-when
-
-(cl::eval-when (:compile-toplevel :execute)
-  (cl::flet ((starts-with-p (str prefix)
-              (cl::and (cl::>= (cl::length str) (cl::length prefix))
-                (cl::string= str prefix :end1 (cl::length prefix)))))
-    (cl::export (cl::loop for sym being each present-symbol of cl::*package*
-                  when (cl::or (starts-with-p (cl::symbol-name sym) (cl::symbol-name :swig-))
-                           (starts-with-p (cl::symbol-name sym) (cl::symbol-name :identifier-convert-)))
-                  collect sym))))
-
-%}
-
-typedef void *__SWIGACL_FwdReference;
-
-%{
-
-#ifdef __cplusplus
-#  define EXTERN   extern "C"
-#else
-#  define EXTERN   extern
-#endif
-
-#define EXPORT   EXTERN SWIGEXPORT
-
-typedef void *__SWIGACL_FwdReference;
-
-#include <string.h>
-#include <stdlib.h>
-%}
diff --git a/Lib/allegrocl/inout_typemaps.i b/Lib/allegrocl/inout_typemaps.i
deleted file mode 100644
index d8d61fe..0000000
--- a/Lib/allegrocl/inout_typemaps.i
+++ /dev/null
@@ -1,111 +0,0 @@
-/* inout_typemaps.i
-
-   Support for INPUT, OUTPUT, and INOUT typemaps. OUTPUT variables are returned
-   as multiple values.
-
-*/
-
-
-/* Note that this macro automatically adds a pointer to the type passed in.
-   As a result, INOUT typemaps for char are for 'char *'. The definition
-   of typemaps for 'char' takes advantage of this, believing that it's more
-   likely to see an INOUT argument for strings, than a single char. */
-%define INOUT_TYPEMAP(type_, OUTresult_, INbind_)
-// OUTPUT map.
-%typemap(lin,numinputs=0) type_ *OUTPUT, type_ &OUTPUT
-%{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c)))
-     $body
-     OUTresult_
-     (ff:free-fobject $out)) %}
-
-// INPUT map.
-%typemap(in) type_ *INPUT, type_ &INPUT
-%{ $1 = &$input; %}
-
-%typemap(ctype) type_ *INPUT, type_ &INPUT "$*1_ltype";
-
-
-// INOUT map.
-// careful here. the input string is converted to a C string
-// with length equal to the input string. This should be large
-// enough to contain whatever OUTPUT value will be stored in it.
-%typemap(lin,numinputs=1) type_ *INOUT, type_ &INOUT
-%{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c)))
-     INbind_
-     $body
-     OUTresult_
-     (ff:free-fobject $out)) %}
-
-%enddef
-
-// $in, $out, $lclass,
-// $in_fftype, $*in_fftype
-
-INOUT_TYPEMAP(int,
-	      (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
-	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
-INOUT_TYPEMAP(short,
-	      (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
-	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
-INOUT_TYPEMAP(long,
-	      (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
-	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
-INOUT_TYPEMAP(unsigned int,
-	      (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
-	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
-INOUT_TYPEMAP(unsigned short,
-	      (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
-	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
-INOUT_TYPEMAP(unsigned long,
-	      (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
-	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
-// char * mapping for passing strings. didn't quite work
-// INOUT_TYPEMAP(char,
-//              (cl::push (excl:native-to-string $out) ACL_result),
-//	      (cl::setf (ff:fslot-value-typed (cl::quote $in_fftype) :c $out)
-//		    (excl:string-to-native $in)))
-INOUT_TYPEMAP(float,
-	      (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
-	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
-INOUT_TYPEMAP(double,
-	      (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result),
-	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
-INOUT_TYPEMAP(bool,
-	      (cl::push (not (zerop (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out)))
-		    ACL_result),
-	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) (if $in 1 0)));
-
-%typemap(lisptype) bool *INPUT, bool &INPUT "boolean";
-
-// long long support not yet complete
-// INOUT_TYPEMAP(long long);
-// INOUT_TYPEMAP(unsigned long long);
-
-// char *OUTPUT map.
-// for this to work, swig needs to know how large an array to allocate.
-// you can fake this by 
-// %typemap(ffitype) char *myarg	"(:array :char 30)";
-// %apply char *OUTPUT { char *myarg };
-%typemap(lin,numinputs=0) char *OUTPUT, char &OUTPUT
-%{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c)))
-     $body
-     (cl::push (excl:native-to-string $out) ACL_result)
-     (ff:free-fobject $out)) %}
-
-// char *INPUT map.
-%typemap(in) char *INPUT, char &INPUT
-%{ $1 = &$input; %}
-%typemap(ctype) char *INPUT, char &INPUT "$*1_ltype";
-
-// char *INOUT map.
-%typemap(lin,numinputs=1) char *INOUT, char &INOUT
-%{(cl::let (($out (excl:string-to-native $in)))
-     $body
-     (cl::push (excl:native-to-string $out) ACL_result)
-     (ff:free-fobject $out)) %}
-
-// uncomment this if you want INOUT mappings for chars instead of strings.
-// INOUT_TYPEMAP(char,
-// 	      (cl::push (code-char (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out))
-//		    ACL_result),
-//	      (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in));
diff --git a/Lib/allegrocl/longlongs.i b/Lib/allegrocl/longlongs.i
deleted file mode 100644
index a15adcd..0000000
--- a/Lib/allegrocl/longlongs.i
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -----------------------------------------------------------------------------
- * longlongs.i
- *
- * Typemap addition for support of 'long long' type and 'unsigned long long 
- * Makes use of swig-def-foreign-class, so this header should be loaded
- * after allegrocl.swg and after any custom user identifier-conversion
- * functions have been defined.
- * ----------------------------------------------------------------------------- */
-
-#ifdef Acl64Bit
-%typemap(ctype) long long, unsigned long long "$1_ltype";
-%typemap(out) long long, unsigned long long "$result = $1;";
-
-%typemap(ffitype) long long ":nat";
-%typemap(ffitype) unsigned long long ":unsigned-nat";
-
-%typemap(lout) long long, unsigned long long "  #+64bit (cl::setq ACL_ffresult $body)";
-
-#else
-%typemap(out) long long, unsigned long long "$result = &$1;";
-%typemap(ffitype) long long "(:struct (l1 :long) (l2 :long))";
-
-%typemap(ffitype) unsigned long long "(:struct (l1 :unsigned-long) (l2 :unsigned-long))";
-
-%typemap(lout) long long 
-"  (cl::setq ACL_ffresult (make-instance '#.(swig-insert-id \"longlong\" () :type :class)
-                  :foreign-address $body))";
-
-%typemap(lout) unsigned long long
-"  (cl:setq ACL_ffresult (make-instance '#.(swig-insert-id \"ulonglong\" () :type :class)
-                  :foreign-address $body))";
-
-#endif
-
-%typemap(in) long long, unsigned long long "$1 = $input;";
-
-
-%insert("lisphead") %{
-
-#-64bit
-(swig-def-foreign-class "longlong"
- (ff:foreign-pointer)
- (:struct (l1 :long) (l2 :long)))
-
-#-64bit
-(swig-def-foreign-class "ulonglong"
- (ff:foreign-pointer)
- (:struct (l1 :unsigned-long) (l2 :unsigned-long)))
-%}
diff --git a/Lib/allegrocl/std_list.i b/Lib/allegrocl/std_list.i
deleted file mode 100644
index a3660c9..0000000
--- a/Lib/allegrocl/std_list.i
+++ /dev/null
@@ -1,230 +0,0 @@
-/* -----------------------------------------------------------------------------
- * std_list.i
- *
- * SWIG typemaps for std::list types
- * 
- * To use, add:
- * 
- * %include "std_list.i"
- *
- * to your interface file. You will also need to include a template directive
- * for each instance of the list container you want to use in your application.
- * e.g.
- * 
- * %template (intlist) std::list<int>;
- * %template (floatlist) std::list<float>;
- * ----------------------------------------------------------------------------- */
-
-%module std_list
-%warnfilter(468) std::list;
-
-%{
-#include <list>
-#include <stdexcept>
-%}
-
-
-namespace std{
-    template<class T> class list
-    {
-    public:
-        typedef size_t size_type;
-        typedef ptrdiff_t difference_type;
-        typedef T value_type;
-        typedef value_type* pointer;
-        typedef const value_type* const_pointer;
-        typedef value_type& reference;
-        typedef const value_type& const_reference;
-	typedef T &iterator;
-	typedef const T& const_iterator; 
-
-	list();
-	list(unsigned int size, const T& value = T());
-	list(const list& other);
-
-	void assign(unsigned int n, const T& value);
-	void swap(list<T> &x);
-
-	const_reference front();
-	const_reference back();
-	const_iterator begin();
-	const_iterator end();
-
-	void resize(unsigned int n, T c = T());
-	bool empty() const;
-
-	void push_front(const T& INPUT);
-	void push_back(const T& INPUT);
-
-	void pop_front();
-	void pop_back();
-	void clear();
-	unsigned int size() const;
-	unsigned int max_size() const;
-	void resize(unsigned int n, const T& INPUT);
-
-	void remove(const T& INPUT);
-	void unique();
-	void reverse();
-	void sort();
-
-	%extend 
-	    {
-	        %typemap(lout) T &__getitem__ "(cl::setq ACL_ffresult (ff:fslot-value-typed '$*out_fftype :c $body))";
-		%typemap(lout) T *__getitem__ "(cl::setq ACL_ffresult (make-instance '$lclass :foreign-address $body))";
-
-		const_reference __getitem__(int i) throw (std::out_of_range) 
-		    {
-			std::list<T>::iterator first = self->begin(); 
-			int size = int(self->size());
-			if (i<0) i += size;
-			if (i>=0 && i<size)
-			{
-			    for (int k=0;k<i;k++)
-			    {
-				first++;
-			    }
-			    return *first;
-			}
-			else throw std::out_of_range("list index out of range");
-		    }
-		void __setitem__(int i, const T& INPUT) throw (std::out_of_range)
-		    {
-			std::list<T>::iterator first = self->begin(); 
-			int size = int(self->size());
-			if (i<0) i += size;
-			if (i>=0 && i<size)
-			{
-			    for (int k=0;k<i;k++)
-			    {
-				first++;
-			    }
-			    *first = INPUT;
-			}
-			else throw std::out_of_range("list index out of range");
-		    }
-		void __delitem__(int i) throw (std::out_of_range)
-		    {
-			std::list<T>::iterator first = self->begin(); 
-			int size = int(self->size());
-			if (i<0) i += size;
-			if (i>=0 && i<size)
-			{
-			    for (int k=0;k<i;k++)
-			    {
-				first++;
-			    }
-			    self->erase(first);
-			}
-			else throw std::out_of_range("list index out of range");
-		    }	     
-		std::list<T> __getslice__(int i,int j) 
-		    {
-			std::list<T>::iterator first = self->begin();
-			std::list<T>::iterator end = self->end();
-
-			int size = int(self->size());
-			if (i<0) i += size;
-			if (j<0) j += size;
-			if (i<0) i = 0;
-			if (j>size) j = size;
-			if (i>=j) i=j;
-			if (i>=0 && i<size && j>=0)
-			{
-			    for (int k=0;k<i;k++)
-			    {
-				first++;
-			    }
-			    for (int m=0;m<j;m++)
-			    {
-				end++;
-			    }
-			    std::list<T> tmp(j-i);
-			    if (j>i) std::copy(first,end,tmp.begin());
-			    return tmp;
-			}
-			else throw std::out_of_range("list index out of range");
-		    }
-		void __delslice__(int i,int j) 
-		    {
-			std::list<T>::iterator first = self->begin();
-			std::list<T>::iterator end = self->end();
-
-			int size = int(self->size());
-			if (i<0) i += size;
-			if (j<0) j += size;
-			if (i<0) i = 0;
-			if (j>size) j = size;
-
-			for (int k=0;k<i;k++)
-			{
-			    first++;
-			}
-			for (int m=0;m<=j;m++)
-			{
-			    end++;
-			}		   
-			self->erase(first,end);		
-		    }
-		void __setslice__(int i,int j, const std::list<T>& v) 
-		    {
-			std::list<T>::iterator first = self->begin();
-			std::list<T>::iterator end = self->end();
-
-			int size = int(self->size());
-			if (i<0) i += size;
-			if (j<0) j += size;
-			if (i<0) i = 0;
-			if (j>size) j = size;
-
-			for (int k=0;k<i;k++)
-			{
-			    first++;
-			}
-			for (int m=0;m<=j;m++)
-			{
-			    end++;
-			}
-			if (int(v.size()) == j-i) 
-			{
-			    std::copy(v.begin(),v.end(),first);
-			}
-			else {
-			    self->erase(first,end);
-			    if (i+1 <= int(self->size())) 
-			    {
-				first = self->begin();
-				for (int k=0;k<i;k++)
-				{
-				    first++;
-				}
-				self->insert(first,v.begin(),v.end());
-			    }
-			    else self->insert(self->end(),v.begin(),v.end());
-			}
-		    }
-		unsigned int __len__() 
-		    {
-			return self->size();
-		    }	
-		bool __nonzero__()
-		    {
-			return !(self->empty());
-		    }
-		void append(const T& INPUT)
-		    {
-			self->push_back(INPUT);
-		    }
-		void pop()
-		    {
-			self->pop_back();
-		    }
-	    }
-    };
-}
-
-
-
-
-
-
diff --git a/Lib/allegrocl/std_string.i b/Lib/allegrocl/std_string.i
deleted file mode 100644
index cbcd250..0000000
--- a/Lib/allegrocl/std_string.i
+++ /dev/null
@@ -1,209 +0,0 @@
-/* -----------------------------------------------------------------------------
- * std_string.i
- *
- * SWIG typemaps for std::string
- * ----------------------------------------------------------------------------- */
-
-// ------------------------------------------------------------------------
-// std::string is typemapped by value
-// This can prevent exporting methods which return a string
-// in order for the user to modify it.
-// However, I think I'll wait until someone asks for it...
-// ------------------------------------------------------------------------
-
-// %include <exception.i>
-%warnfilter(404) std::string;
-%warnfilter(404) std::wstring;
-
-%{
-#include <string>
-%}
-
-// %include <std_vector.i>
-
-// %naturalvar std::string;
-// %naturalvar std::wstring;
-
-namespace std {
-    typedef unsigned long size_t;
-    typedef signed long ptrdiff_t;
-
-    template <class charT> class basic_string {
-    public:
-	typedef charT *pointer;
-	typedef charT &reference;
-	typedef const charT &const_reference;
-	typedef size_t size_type;
-	typedef ptrdiff_t difference_type;
-	basic_string();
-	basic_string( charT *str );
-	size_type size();
-	charT operator []( int pos ) const;
-	charT *c_str() const;
-	basic_string<charT> &operator = ( const basic_string &ws );
-	basic_string<charT> &operator = ( const charT *str );
-	basic_string<charT> &append( const basic_string<charT> &other );
-	basic_string<charT> &append( const charT *str );
-	void push_back( charT c );
-	void clear();
-	void reserve( size_type t );
-	void resize( size_type n, charT c = charT() );
-	int compare( const basic_string<charT> &other ) const;
-	int compare( const charT *str ) const;
-	basic_string<charT> &insert( size_type pos, 
-				     const basic_string<charT> &str );
-	size_type find( const basic_string<charT> &other, int pos = 0 ) const;
-	size_type find( charT c, int pos = 0 ) const;
-	%extend {
-	    bool operator == ( const basic_string<charT> &other ) const {
-		return self->compare( other ) == 0;
-	    }
-	    bool operator != ( const basic_string<charT> &other ) const {
-		return self->compare( other ) != 0;
-	    }
-	    bool operator < ( const basic_string<charT> &other ) const {
-		return self->compare( other ) == -1;
-	    }
-	    bool operator > ( const basic_string<charT> &other ) const {
-		return self->compare( other ) == 1;
-	    }
-	    bool operator <= ( const basic_string<charT> &other ) const {
-		return self->compare( other ) != 1;
-	    }
-	    bool operator >= ( const basic_string<charT> &other ) const {
-		return self->compare( other ) != -1;
-	    }
-
-	}
-    };
-
-    %template(string) basic_string<char>;
-    %template(wstring) basic_string<wchar_t>;
-
-    %apply char * { string };
-    %apply wchar_t * { wstring };
-
-    typedef basic_string<char> string;
-    typedef basic_string<wchar_t> wstring;
-
-    // automatically convert constant std::strings to cl:strings
-    %typemap(ctype) string "char *";
-    %typemap(in) string "$1.assign($input);";
-    %typemap(out) string "$result = (char *)(&$1)->c_str();";
-    %typemap(lisptype) string "cl:string";
-    %typemap(lout) string "(cl::setq ACL_ffresult $body)";
-
-    %typemap(ctype) const string *"char *";
-    %typemap(in) const string * "$1.assign($input);";
-    %typemap(out) const string * "$result = (char *)($1)->c_str();";
-    %typemap(lisptype) const string * "cl:string";
-    %typemap(lout) const string * "(cl::setq ACL_ffresult $body)";
-
-    %typemap(ctype) wstring "wchar_t *";
-    %typemap(in) wstring "$1.assign($input);";
-    %typemap(out) wstring "$result = (wchar_t *)(&$1)->c_str();";
-    %typemap(lisptype) wstring "cl:string";
-    %typemap(lout) wstring "(cl::setq ACL_ffresult (excl:native-to-string $body
-:external-format #+little-endian :fat-le #-little-endian :fat))";
-
-    %typemap(ctype) const wstring *"char *";
-    %typemap(in) const wstring * "$1.assign($input);";
-    %typemap(out) const wstring * "$result = (char *)($1)->c_str();";
-    %typemap(lisptype) const wstring * "cl:string";
-    %typemap(lout) const wstring * "(cl::setq ACL_ffresult $body)";
-
-    /* Overloading check */
-//     %typemap(in) string {
-//         if (caml_ptr_check($input))
-//             $1.assign((char *)caml_ptr_val($input,0),
-// 			 caml_string_len($input));
-//         else
-//             SWIG_exception(SWIG_TypeError, "string expected");
-//     }
-
-//     %typemap(in) const string & ($*1_ltype temp) {
-//         if (caml_ptr_check($input)) {
-//             temp.assign((char *)caml_ptr_val($input,0),
-// 			   caml_string_len($input));
-//             $1 = &temp;
-//         } else {
-//             SWIG_exception(SWIG_TypeError, "string expected");
-//         }
-//     }
-
-//     %typemap(in) string & ($*1_ltype temp) {
-//         if (caml_ptr_check($input)) {
-//             temp.assign((char *)caml_ptr_val($input,0),
-// 			   caml_string_len($input));
-//             $1 = &temp;
-//         } else {
-//             SWIG_exception(SWIG_TypeError, "string expected");
-//         }
-//     }
-
-//     %typemap(in) string * ($*1_ltype *temp) {
-//         if (caml_ptr_check($input)) {
-//             temp = new $*1_ltype((char *)caml_ptr_val($input,0),
-// 				   caml_string_len($input));
-//             $1 = temp;
-//         } else {
-//             SWIG_exception(SWIG_TypeError, "string expected");
-//         }
-//     }
-
-//     %typemap(free) string * ($*1_ltype *temp) {
-// 	delete temp;
-//     }
-
-//    %typemap(argout) string & {
-//	caml_list_append(swig_result,caml_val_string_len((*$1).c_str(),
-//							 (*$1).size()));
-//    }
-
-//    %typemap(directorout) string {
-//	$result.assign((char *)caml_ptr_val($input,0),
-//		       caml_string_len($input));
-//    }
-
-//    %typemap(out) string {
-//        $result = caml_val_string_len($1.c_str(),$1.size());
-//    }
-
-//    %typemap(out) string * {
-//	$result = caml_val_string_len((*$1).c_str(),(*$1).size());
-//    }
-}
-
-// #ifdef ENABLE_CHARPTR_ARRAY
-// char **c_charptr_array( const std::vector <string > &str_v );
-
-// %{
-//   SWIGEXT char **c_charptr_array( const std::vector <string > &str_v ) {
-//     char **out = new char *[str_v.size() + 1];
-//     out[str_v.size()] = 0;
-//     for( int i = 0; i < str_v.size(); i++ ) {
-//       out[i] = (char *)str_v[i].c_str();
-//     }
-//     return out;
-//   }
-// %}
-// #endif
-
-// #ifdef ENABLE_STRING_VECTOR
-// %template (StringVector) std::vector<string >;
-
-// %insert(ml) %{
-//   (* Some STL convenience items *)
-
-//   let string_array_to_vector sa = 
-//     let nv = _new_StringVector C_void in
-//       array_to_vector nv (fun x -> C_string x) sa ; nv
-	
-//   let c_string_array ar = 
-//     _c_charptr_array (string_array_to_vector ar)
-// %}
-
-// %insert(mli) %{
-//   val c_string_array: string array -> c_obj
-// %}
-// #endif
diff --git a/Lib/allegrocl/typemaps.i b/Lib/allegrocl/typemaps.i
deleted file mode 100644
index 293d1cd..0000000
--- a/Lib/allegrocl/typemaps.i
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Unused for Allegro CL module */
-
-%include "inout_typemaps.i"
-%include "longlongs.i"
diff --git a/Source/Modules/allegrocl.cxx b/Source/Modules/allegrocl.cxx
deleted file mode 100644
index e39abed..0000000
--- a/Source/Modules/allegrocl.cxx
+++ /dev/null
@@ -1,2962 +0,0 @@
-/* ----------------------------------------------------------------------------- 
- * This file is part of SWIG, which is licensed as a whole under version 3 
- * (or any later version) of the GNU General Public License. Some additional
- * terms also apply to certain portions of SWIG. The full details of the SWIG
- * license and copyrights can be found in the LICENSE and COPYRIGHT files
- * included with the SWIG source code as distributed by the SWIG developers
- * and at http://www.swig.org/legal.html.
- *
- * allegrocl.cxx
- *
- * ALLEGROCL language module for SWIG.
- * ----------------------------------------------------------------------------- */
-
-#include "swigmod.h"
-#include "cparse.h"
-#include <ctype.h>
-
-// #define ALLEGROCL_DEBUG
-// #define ALLEGROCL_WRAP_DEBUG
-// #define ALLEGROCL_TYPE_DEBUG
-// #define ALLEGROCL_CLASS_DEBUG
-
-static const char *usage = "\
-Allegro CL Options (available with -allegrocl)\n\
-     -identifier-converter <type or funcname> - \n\
-                       Specifies the type of conversion to do on C identifiers to convert\n\
-                       them to symbols. There are two built-in converters: 'null' and\n\
-                       'lispify'. The default is 'null'. If you supply a name other\n\
-                       than one of the built-ins, then a function by that name will be\n\
-                       called to convert identifiers to symbols.\n\
-     -[no]cwrap      - Turn on or turn off generation of an intermediate C file when\n\
-                       creating a C interface. By default this is only done for C++ code.\n\
-     -isolate        - Define all SWIG helper functions in a package unique to this\n\
-                       module. Avoids redefinition warnings when loading multiple\n\
-                       SWIGged modules into the same running Allegro CL image.\n\
-";
-
-static File *f_cl = 0;
-String *f_clhead = NewString("");
-String *f_clwrap = NewString("(swig-in-package ())\n\n");
-static File *f_begin;
-static File *f_runtime;
-static File *f_cxx_header = 0;
-static File *f_cxx_wrapper = 0;
-
-static String *module_name = 0;
-static String *swig_package = 0;
-
-static String *identifier_converter = NewString("identifier-convert-null");
-
-static bool CWrap = true;	// generate wrapper file for C code by default. most correct.
-static bool Generate_Wrapper = false;
-static bool unique_swig_package = false;
-
-static SwigType *fwdref_ffi_type = NewString("__SWIGACL_FwdReference");
-
-static String *current_namespace = NewString("");
-static String *current_package = NewString("");
-static Hash *defined_namespace_packages = NewHash();
-static Node *in_class = 0;
-
-static Node *first_linked_type = 0;
-static Hash *defined_foreign_types = NewHash();
-static Hash *defined_foreign_ltypes = NewHash();
-
-static String *anon_type_name = NewString("anontype");
-static int anon_type_count = 0;
-
-// stub
-String *convert_literal(String *num_param, String *type, bool try_to_split = true);
-
-class ALLEGROCL:public Language {
-public:
-  virtual void main(int argc, char *argv[]);
-  virtual int top(Node *n);
-  virtual int functionWrapper(Node *n);
-  virtual int namespaceDeclaration(Node *n);
-  virtual int constructorHandler(Node *n);
-  virtual int destructorHandler(Node *n);
-  virtual int globalvariableHandler(Node *n);
-  virtual int variableWrapper(Node *n);
-  virtual int constantWrapper(Node *n);
-  virtual int memberfunctionHandler(Node *n);
-  virtual int membervariableHandler(Node *n);
-  virtual int classHandler(Node *n);
-  virtual int emit_one(Node *n);
-  virtual int enumDeclaration(Node *n);
-  virtual int enumvalueDeclaration(Node *n);
-  virtual int typedefHandler(Node *n);
-  virtual int classforwardDeclaration(Node *n);
-  virtual int templateDeclaration(Node *n);
-  virtual int validIdentifier(String *s);
-private:
-  int emit_defun(Node *n, File *f_cl);
-  int emit_dispatch_defun(Node *n);
-  int emit_buffered_defuns(Node *n);
-  int cClassHandler(Node *n);
-  int cppClassHandler(Node *n);
-};
-static ALLEGROCL *allegrocl = 0;
-
-static String *trim(String *str) {
-  char *c = Char(str);
-  while (*c != '\0' && isspace((int) *c))
-    ++c;
-  String *result = NewString(c);
-  Chop(result);
-  return result;
-}
-
-int is_integer(String *s) {
-  char *c = Char(s);
-  if (c[0] == '#' && (c[1] == 'x' || c[1] == 'o'))
-    c += 2;
-
-  while (*c) {
-    if (!isdigit(*c))
-      return 0;
-    c++;
-  }
-  return 1;
-}
-
-String *class_from_class_or_class_ref(String *type) {
-  SwigType *stripped = SwigType_strip_qualifiers(type);
-  if (SwigType_isclass(stripped))
-    return stripped;
-
-  if (SwigType_ispointer(stripped) || SwigType_isreference(stripped)) {
-    // Printf(stderr,"It is a pointer/reference. Is it a class?\n");
-    SwigType_pop(stripped);
-    if (SwigType_isclass(stripped)) {
-      return stripped;
-    }
-  }
-  return 0;
-}
-
-String *lookup_defined_foreign_type(String *k) {
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "Looking up defined type '%s'.\n  Found: '%s'\n", k, Getattr(defined_foreign_types, k));
-#endif
-
-  return Getattr(defined_foreign_types, k);
-}
-
-String *listify_namespace(String *namespaze) {
-  if (Len(namespaze) == 0)
-    return NewString("()");
-  String *result = NewStringf("(\"%s\")", namespaze);
-  Replaceall(result, "::", "\" \"");
-  return result;
-}
-
-String *namespaced_name(Node *n, String *ns = current_namespace) {
-
-  return NewStringf("%s%s%s", ns, (Len(ns) != 0) ? "::" : "", Getattr(n, "sym:name"));
-}
-
-// "Namespace::Nested::Class2::Baz" -> "Baz"
-static String *strip_namespaces(String *str) {
-  return Swig_scopename_last(str);
-}
-
-void add_linked_type(Node *n) {
-#ifdef ALLEGROCL_CLASS_DEBUG
-  Printf(stderr, "Adding linked node of type: %s(%s) %s(%p)\n\n", nodeType(n), Getattr(n, "storage"), Getattr(n, "name"), n);
-  // Swig_print_node(n);
-#endif
-  if (!first_linked_type) {
-    first_linked_type = n;
-    Setattr(n, "allegrocl:last_linked_type", n);
-  } else {
-    Node *t = Getattr(first_linked_type, "allegrocl:last_linked_type");
-    Setattr(t, "allegrocl:next_linked_type", n);
-    Setattr(first_linked_type, "allegrocl:last_linked_type", n);
-  }
-}
-
-void replace_linked_type(Node *old, Node *new_node) {
-  Node *prev = Getattr(old, "allegrocl:prev_linked_type");
-
-  Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type"));
-  if (prev)
-    Setattr(prev, "allegrocl:next_linked_type", new_node);
-  Delattr(old, "allegrocl:next_linked_type");
-  Delattr(old, "allegrocl:prev_linked_type");
-
-  // check if we're replacing the first link.
-  if (first_linked_type == old) {
-    first_linked_type = new_node;
-    Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(old, "allegrocl:last_linked_type"));
-  }
-  // check if we're replacing the last link.
-  if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old)
-    Setattr(first_linked_type, "allegrocl:last_linked_type", new_node);
-}
-
-void insert_linked_type_at(Node *old, Node *new_node, int before = 1) {
-  Node *p = 0;
-
-  if (!first_linked_type) {
-    add_linked_type(new_node);
-    return;
-  }
-
-  if (!before) {
-    Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type"));
-    Setattr(old, "allegrocl:next_linked_type", new_node);
-    if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old)
-      Setattr(first_linked_type, "allegrocl:last_linked_type", new_node);
-  } else {
-    Node *c = first_linked_type;
-    while (c) {
-      if (c == old) {
-	break;
-      } else {
-	p = c;
-	c = Getattr(c, "allegrocl:next_linked_type");
-      }
-    }
-    if (c == old) {
-      Setattr(new_node, "allegrocl:next_linked_type", c);
-      if (first_linked_type == c) {
-	first_linked_type = new_node;
-	Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(c, "allegrocl:last_linked_type"));
-	Delattr(c, "allegrocl:last_linked_type");
-      }
-      if (p)
-	Setattr(p, "allegrocl:next_linked_type", new_node);
-    }
-  }
-}
-
-Node *find_linked_type_by_name(String *name) {
-  Node *p = 0;
-  Node *c = first_linked_type;
-
-  // Printf(stderr,"in find_linked_type_by_name '%s'...", name);
-  while (c) {
-    String *key = Getattr(c, "name");
-    if (!Strcmp(key, name)) {
-      break;
-    } else {
-      p = c;
-      c = Getattr(c, "allegrocl:next_linked_type");
-    }
-  }
-  // Printf(stderr,"exit find_linked_type_by_name.\n");
-
-  if (p && c)
-    Setattr(c, "allegrocl:prev_linked_type", p);
-  // Printf(stderr,"find_linked_type_by_name: DONE\n");
-  return c;
-}
-
-Node *get_primary_synonym_of(Node *n) {
-  Node *p = Getattr(n, "allegrocl:synonym-of");
-  Node *prim = n;
-
-  // Printf(stderr, "getting primary synonym of %p\n", n);
-  while (p) {
-    // Printf(stderr, "   found one! %p\n", p);
-    prim = p;
-    p = Getattr(p, "allegrocl:synonym-of");
-  }
-  // Printf(stderr,"get_primary_syn: DONE. returning %s(%p)\n", Getattr(prim,"name"),prim);
-  return prim;
-}
-
-void add_forward_referenced_type(Node *n, int overwrite = 0) {
-  String *k = Getattr(n, "name");
-  String *name = Getattr(n, "sym:name");
-  String *ns = listify_namespace(current_namespace);
-
-  String *val = Getattr(defined_foreign_types, k);
-
-  if (!val || overwrite) {
-#ifdef ALLEGROCL_TYPE_DEBUG
-    Printf(stderr, "Adding forward reference for %s (overwrite=%d)\n", k, overwrite);
-#endif
-    Setattr(defined_foreign_types, Copy(k), NewString("forward-reference"));
-
-    String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns);
-
-    Setattr(defined_foreign_ltypes, Copy(k), mangled_lname_gen);
-    //    Printf(f_cl, ";; forward reference stub\n"
-    //           "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n"
-    //     , name);
-
-#ifdef ALLEGROCL_CLASS_DEBUG
-    Printf(stderr, "Linking forward reference type = %s(%p)\n", k, n);
-#endif
-    add_linked_type(n);
-  }
-}
-
-void add_defined_foreign_type(Node *n, int overwrite = 0, String *k = 0,
-			      String *name = 0, String *ns = current_namespace) {
-
-  String *val;
-  String *ns_list = listify_namespace(ns);
-  String *templated = n ? Getattr(n, "template") : 0;
-  String *cDeclName = n ? Getattr(n, "name") : 0;
-
-#ifdef ALLEGROCL_CLASS_DEBUG
-  Printf(stderr, "IN A-D-F-T. (n=%p, ow=%d, k=%s, name=%s, ns=%s\n", n, overwrite, k, name, ns);
-  Printf(stderr, "    templated = '%p', classDecl = '%p'\n", templated, cDeclName);
-#endif
-  if (n) {
-    if (!name)
-      name = Getattr(n, "sym:name");
-    if (!name)
-      name = strip_namespaces(Getattr(n, "name"));
-    if (templated) {
-      k = namespaced_name(n);
-    } else {
-      String *kind_of_type = Getattr(n, "kind");
-
-      /*
-         For typedefs of the form:
-
-         typedef struct __xxx { ... } xxx;
-
-	 behavior differs between C mode and C++ mode.
-
-	 C Mode:
-         add_defined_foreign_type will be called once via classHandler
-         to define the type for 'struct __xxx' and add the mapping from
-	 'struct __xxx' -> 'xxx'
-
-	 It will also be called once via typedefHandler to add the
-	 mapping 'xxx' -> 'xxx'
-
-	 C++ Mode:
-	 add_defined_foreign_type will be called once via classHandler
-	 to define the type for 'xxx'. it also adds the mapping from
-	 'xxx' -> 'xxx' and also for 'struct xxx' -> 'xxx'
-
-	 In typedefHandler, we again try to add the mapping from
-	 'xxx' -> 'xxx', which already exists. This second mapping
-	 is ignored.
-
-	 Both modes:
-
-         All references to this typedef'd struct will appear in
-         generated lisp code as an objectd of type 'xxx'. For
-         non-typedef'd structs, the classHand mapping will be
-
-           struct __xxx -> (swig-insert-id "__xxx")
-       */
-      // Swig_print_node(n);
-      String *unnamed = Getattr(n, "unnamed");
-      if (kind_of_type && (!Strcmp(kind_of_type, "struct")
-			   || !Strcmp(kind_of_type, "union")) && cDeclName && !unnamed) {
-	k = NewStringf("%s %s", kind_of_type, cDeclName);
-      } else {
-	if (!Strcmp(nodeType(n), "enum") && unnamed) {
-	  name = NewStringf("%s%d", anon_type_name, anon_type_count++);
-	  k = NewStringf("enum %s", name);
-	  Setattr(n, "allegrocl:name", name);
-
-	} else {
-	  k = k ? k : Getattr(n, "name");
-	}
-      }
-    }
-    // Swig_print_node(n);
-  }
-
-  String *tname = SwigType_istemplate_templateprefix(name);
-  if (tname) {
-    String *temp = strip_namespaces(tname);
-    name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name));
-    Delete(temp);
-    Delete(tname);
-  }
-
-  val = lookup_defined_foreign_type(k);
-
-  int is_fwd_ref = 0;
-  if (val)
-    is_fwd_ref = !Strcmp(val, "forward-reference");
-
-  if (!val || overwrite || is_fwd_ref) {
-#ifdef ALLEGROCL_CLASS_DEBUG
-    Printf(stderr, "Adding defined type '%s' = '%s' '%s' (overwrite=%d, in-class=%d)\n", k, ns, name, overwrite, in_class);
-#endif
-    String *mangled_name_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", name, ns_list);
-    String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns_list);
-
-    Setattr(defined_foreign_types, Copy(k), Copy(mangled_name_gen));
-    Setattr(defined_foreign_ltypes, Copy(k), Copy(mangled_lname_gen));
-
-    if (CPlusPlus) {
-      bool cpp_struct = Strstr(k, "struct ") ? true : false;
-      bool cpp_union = Strstr(k, "union ") ? true : false;
-
-      String *cpp_type = 0;
-      if (cpp_struct) {
-	cpp_type = Copy(k);
-	Replaceall(cpp_type, "struct ", "");
-      } else if (cpp_union) {
-	cpp_type = Copy(k);
-	Replaceall(cpp_type, "union ", "");
-      }
-
-      if (cpp_struct || cpp_union) {
-#ifdef ALLEGROCL_CLASS_DEBUG
-	Printf(stderr, " Also adding defined type '%s' = '%s' '%s' (overwrite=%d)\n", cpp_type, ns, name, overwrite);
-#endif
-	Setattr(defined_foreign_types, Copy(cpp_type), Copy(mangled_name_gen));
-	Setattr(defined_foreign_ltypes, Copy(cpp_type), Copy(mangled_lname_gen));
-      }
-    }
-#ifdef ALLEGROCL_CLASS_DEBUG
-    Printf(stderr, "looking to add %s/%s(%p) to linked_type_list...\n", k, name, n);
-#endif
-    if (is_fwd_ref) {
-      // Printf(stderr,"*** 1\n");
-      if (n)
-	add_linked_type(n);
-    } else {
-      // Printf(stderr,"*** 1-a\n");
-      if (SwigType_istemplate(k)) {
-	SwigType *resolved = SwigType_typedef_resolve_all(k);
-	// Printf(stderr,"*** 1-b\n");
-	Node *match = find_linked_type_by_name(resolved);
-	Node *new_node = 0;
-	// Printf(stderr, "*** temp-1\n");
-	if (n) {
-	  new_node = n;
-	} else {
-#ifdef ALLEGROCL_CLASS_DEBUG
-	  Printf(stderr, "Creating a new templateInst:\n");
-	  Printf(stderr, "       name = %s\n", resolved);
-	  Printf(stderr, "   sym:name = %s\n", name);
-	  Printf(stderr, "  real-name = %s\n", k);
-	  Printf(stderr, "       type = %s\n", resolved);
-	  Printf(stderr, "         ns = %s\n\n", ns);
-#endif
-	  new_node = NewHash();
-	  Setattr(new_node, "nodeType", "templateInst");
-	  Setattr(new_node, "name", Copy(resolved));
-	  Setattr(new_node, "sym:name", Copy(name));
-	  Setattr(new_node, "real-name", Copy(k));
-	  Setattr(new_node, "type", Copy(resolved));
-	  Setattr(new_node, "allegrocl:namespace", ns);
-	  Setattr(new_node, "allegrocl:package", ns);
-	}
-
-	if (!match) {
-	  if (!Strcmp(nodeType(new_node), "templateInst") && in_class) {
-	    /* this is an implicit template instantiation found while
-	       walking a class. need to insert this into the
-	       linked_type list before the current class definition */
-#ifdef ALLEGROCL_CLASS_DEBUG
-	    Printf(stderr, "trying to insert a templateInst before a class\n");
-#endif
-	    insert_linked_type_at(in_class, new_node);
-#ifdef ALLEGROCL_CLASS_DEBUG
-	    Printf(stderr, "DID IT!\n");
-#endif
-	  } else {
-	    // Printf(stderr,"*** 3\n");
-	    add_linked_type(new_node);
-	  }
-	  Setattr(new_node, "allegrocl:synonym:is-primary", "1");
-	} else {
-	  // a synonym type was found (held in variable 'match')
-	  // Printf(stderr, "setting primary synonym of %p to %p\n", new_node, match);
-	  if (new_node == match)
-	    Printf(stderr, "Hey-4 * - '%s' is a synonym of itself!\n", Getattr(new_node, "name"));
-	  Setattr(new_node, "allegrocl:synonym-of", match);
-	  // Printf(stderr,"*** 4\n");
-	  add_linked_type(new_node);
-	}
-      } else {
-	Node *match;
-
-	if (!Strcmp(nodeType(n), "cdecl") && !Strcmp(Getattr(n, "storage"), "typedef")) {
-	  SwigType *type = SwigType_strip_qualifiers(Getattr(n, "type"));
-#ifdef ALLEGROCL_CLASS_DEBUG
-	  Printf(stderr, "Examining typedef '%s' for class references. (%d)\n", type, SwigType_isclass(type));
-#endif
-	  if (SwigType_isclass(type)) {
-#ifdef ALLEGROCL_CLASS_DEBUG
-	    Printf(stderr, "Found typedef of a class '%s'\n", type);
-#endif
-	    /* 
-	       For the following parsed expression:
-
-	       typedef struct __xxx { ... } xxx;
-
-	       if n is of kind "class" (defining the class 'struct __xxx'
-	       then we add n to the linked type list.
-
-	       if n is "cdecl" node of storage "typedef" (to note
-	       that xxx is equivalent to 'struct __xxx' then we don't
-	       want to add this node to the linked type list.
-	     */
-	    String *defined_type = lookup_defined_foreign_type(type);
-	    String *defined_key_type = lookup_defined_foreign_type(k);
-
-	    if ((Strstr(type, "struct ") || Strstr(type, "union "))
-		&& defined_type && !Strcmp(defined_type, defined_key_type)) {
-	      // mark as a synonym but don't add to linked_type list
-	      // Printf(stderr,"*** 4.8\n");
-	      Setattr(n, "allegrocl:synonym", "1");
-	    } else {
-	      SwigType *lookup_type = SwigType_istemplate(type) ? SwigType_typedef_resolve_all(type) : Copy(type);
-	      match = find_linked_type_by_name(lookup_type);
-	      if (match) {
-		Setattr(n, "allegrocl:synonym", "1");
-		Setattr(n, "allegrocl:synonym-of", match);
-		Setattr(n, "real-name", Copy(lookup_type));
-
-		// Printf(stderr, "*** pre-5: found match of '%s'(%p)\n", Getattr(match,"name"),match);
-		// if(n == match) Printf(stderr, "Hey-5 *** setting synonym of %p to %p\n", n, match);
-		// Printf(stderr,"*** 5\n");
-		add_linked_type(n);
-	      } else {
-#ifdef ALLEGROCL_CLASS_DEBUG
-		Printf(stderr, "Creating classfoward node for struct stub in typedef.\n");
-#endif
-		Node *new_node = NewHash();
-		String *symname = Copy(type);
-		Replaceall(symname, "struct ", "");
-		Setattr(new_node, "nodeType", "classforward");
-		Setattr(new_node, "name", Copy(type));
-		Setattr(new_node, "sym:name", symname);
-		Setattr(new_node, "allegrocl:namespace", ns);
-		Setattr(new_node, "allegrocl:package", ns);
-
-		String *mangled_new_name = NewStringf("#.(swig-insert-id \"%s\" %s)", symname, ns_list);
-		String *mangled_new_lname = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", symname, ns_list);
-		Setattr(defined_foreign_types, Copy(symname), Copy(mangled_new_name));
-		Setattr(defined_foreign_ltypes, Copy(symname), Copy(mangled_new_lname));
-
-		// Printf(stderr,"Weird! Can't find the type!\n");
-		add_forward_referenced_type(new_node);
-		add_linked_type(new_node);
-
-		Setattr(n, "allegrocl:synonym", "1");
-		Setattr(n, "allegrocl:synonym-of", new_node);
-
-		add_linked_type(n);
-	      }
-	      Delete(lookup_type);
-	    }
-	  } else {
-	    // check if it's a pointer or reference to a class.
-	    // Printf(stderr,"Checking if '%s' is a p. or r. to a class\n", type);
-	    String *class_ref = class_from_class_or_class_ref(type);
-	    if (class_ref) {
-	      match = find_linked_type_by_name(class_ref);
-	      Setattr(n, "allegrocl:synonym", "1");
-	      Setattr(n, "allegrocl:synonym-of", match);
-	      add_linked_type(n);
-	    }
-	  }
-	  Delete(type);
-	  // synonym types have already been added.
-	  // Printf(stderr,"*** 10\n");
-	  if (!Getattr(n, "allegrocl:synonym"))
-	    add_linked_type(n);
-	} else if (Getattr(n, "template")) {
-	  // Printf(stderr, "this is a class template node(%s)\n", nodeType(n));
-	  String *resolved = SwigType_typedef_resolve_all(Getattr(n, "name"));
-
-#ifdef ALLEGROCL_CLASS_DEBUG
-	  Printf(stderr, "   looking up %s for linked type match with %s...\n", Getattr(n, "sym:name"), resolved);
-#endif
-	  match = find_linked_type_by_name(resolved);
-	  if (!match) {
-#ifdef ALLEGROCL_CLASS_DEBUG
-	    Printf(stderr, "found no implicit instantiation of %%template node %s(%p)\n", Getattr(n, "name"), n);
-#endif
-	    add_linked_type(n);
-	  } else {
-	    Node *primary = get_primary_synonym_of(match);
-
-	    Setattr(n, "allegrocl:synonym:is-primary", "1");
-	    Delattr(primary, "allegrocl:synonym:is-primary");
-	    if (n == match)
-	      Printf(stderr, "Hey-7 * setting synonym of %p to %p\n (match = %p)", primary, n, match);
-	    Setattr(primary, "allegrocl:synonym-of", n);
-	    // Printf(stderr,"*** 7\n");
-	    add_linked_type(n);
-	  }
-	} else {
-#ifdef ALLEGROCL_CLASS_DEBUG
-	  Printf(stderr, "linking type '%s'(%p)\n", k, n);
-#endif
-	  // Printf(stderr,"*** 8\n");
-	  add_linked_type(n);
-	}
-      }
-    }
-    Delete(mangled_name_gen);
-    Delete(mangled_lname_gen);
-  } else {
-    if (!CPlusPlus || Strcmp(Getattr(n,"kind"),"typedef")) {
-       Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n),
-		    "Attempting to store a foreign type that exists: %s (%s)\n",
-		    k, val);
-    } 
-  }
-
-  Delete(ns_list);
-
-#ifdef ALLEGROCL_CLASS_DEBUG
-  Printf(stderr, "OUT A-D-F-T\n");
-#endif
-}
-
-void note_implicit_template_instantiation(SwigType *t) {
-  // the namespace of the implicit instantiation is not necessarily
-  // current_namespace. Attempt to cull this from the type.
-#ifdef ALLEGROCL_CLASS_DEBUG
-  Printf(stderr, "culling namespace of '%s' from '%s'\n", t, SwigType_templateprefix(t));
-#endif
-  SwigType *type = Copy(t);
-  SwigType *tok = SwigType_pop(type);
-  String *implicit_ns = SwigType_istemplate(tok) ? Swig_scopename_prefix(SwigType_templateprefix(tok)) : 0;
-  add_defined_foreign_type(0, 0, t, t, implicit_ns ? implicit_ns : current_namespace);
-
-  Delete(type);
-}
-
-String *get_ffi_type(Node *n, SwigType *ty, const_String_or_char_ptr name) {
-  /* lookup defined foreign type.
-     if it exists, it will return a form suitable for placing
-     into lisp code to generate the def-foreign-type name */
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "inside g_f_t: looking up '%s' '%s'\n", ty, name);
-#endif
-
-  String *found_type = lookup_defined_foreign_type(ty);
-
-  if (found_type) {
-#ifdef ALLEGROCL_TYPE_DEBUG
-    Printf(stderr, "found_type '%s'\n", found_type);
-#endif
-    return (Strcmp(found_type, "forward-reference") ? Copy(found_type) : get_ffi_type(n, fwdref_ffi_type, ""));
-  } else {
-    Node *node = NewHash();
-    Setattr(node, "type", ty);
-    Setfile(node, Getfile(n));
-    Setline(node, Getline(n));
-    const String *tm = Swig_typemap_lookup("ffitype", node, name, 0);
-    Delete(node);
-
-    if (tm) {
-#ifdef ALLEGROCL_TYPE_DEBUG
-      Printf(stderr, "g-f-t: found ffitype typemap '%s'\n", tm);
-#endif
-      return NewString(tm);
-    }
-
-    if (SwigType_istemplate(ty)) {
-      note_implicit_template_instantiation(ty);
-      return Copy(lookup_defined_foreign_type(ty));
-    }
-  }
-  return 0;
-}
-
-String *lookup_defined_foreign_ltype(String *l) {
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "Looking up defined ltype '%s'.\n  Found: '%s'\n", l, Getattr(defined_foreign_ltypes, l));
-#endif
-  return Getattr(defined_foreign_ltypes, l);
-}
-
-/* walk type and return string containing lisp version.
-   recursive. */
-String *internal_compose_foreign_type(Node *n, SwigType *ty) {
-
-  SwigType *tok;
-  String *ffiType = NewString("");
-
-  // for a function type, need to walk the parm list.
-  while (Len(ty) != 0) {
-    tok = SwigType_pop(ty);
-
-    if (SwigType_isfunction(tok)) {
-      // Generate Function wrapper
-      Printf(ffiType, "(:function ");
-      // walk parm list
-      List *pl = SwigType_parmlist(tok);
-
-      Printf(ffiType, "(");	// start parm list
-      for (Iterator i = First(pl); i.item; i = Next(i)) {
-	SwigType *f_arg = SwigType_strip_qualifiers(i.item);
-	Printf(ffiType, "%s ", internal_compose_foreign_type(n, f_arg));
-	Delete(f_arg);
-      }
-      Printf(ffiType, ")");	// end parm list.
-
-      // do function return type.
-      Printf(ffiType, " %s)", internal_compose_foreign_type(n, ty));
-      break;
-    } else if (SwigType_ispointer(tok) || SwigType_isreference(tok)) {
-      Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty));
-    } else if (SwigType_isarray(tok)) {
-      Printf(ffiType, "(:array %s", internal_compose_foreign_type(n, ty));
-      String *atype = NewString("int");
-      String *dim = convert_literal(SwigType_array_getdim(tok, 0), atype);
-      Delete(atype);
-      if (is_integer(dim)) {
-	Printf(ffiType, " %s)", dim);
-      } else {
-	Printf(ffiType, " #| %s |#)", SwigType_array_getdim(tok, 0));
-      }
-    } else if (SwigType_ismemberpointer(tok)) {
-      // temp
-      Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty));
-    } else {
-      String *res = get_ffi_type(n, tok, "");
-      if (res) {
-	Printf(ffiType, "%s", res);
-      } else {
-	SwigType *resolved_type = SwigType_typedef_resolve_all(tok);
-	if (Cmp(resolved_type, tok) != 0) {
-	  res = get_ffi_type(n, resolved_type, "");
-	  if (res) {
-	  } else {
-	    res = internal_compose_foreign_type(n, resolved_type);
-	  }
-	  if (res)
-	    Printf(ffiType, "%s", res);
-	}
-
-	if (!res) {
-	  String *is_struct = 0;
-	  String *tok_remove_text = 0;
-	  String *tok_name = Copy(tok);
-	  String *tok_key = SwigType_str(tok,0);
-	  if ((is_struct = Strstr(tok_key, "struct ")) || Strstr(tok_key, "union ")) {
-	    tok_remove_text = NewString(is_struct ? "struct " : "union ");
-	  }
-
-	  /* be more permissive of opaque types. This is the swig way.
-	     compiles will notice if these types are ultimately not
-	     present. */
-
-	  if(tok_remove_text) {
-	    Replaceall(tok_name,tok_remove_text,"");
-	  }
-	  tok_name = strip_namespaces(tok_name);
-	  Delete(tok_remove_text);
-	  // Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(tok), Getline(tok), "Unable to find definition of '%s', assuming forward reference.\n", tok);
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-	  Printf(stderr, "i-c-f-t: adding forward reference for unknown type '%s'. mapping: %s -> %s\n", tok, tok_key, tok_name);
-#endif
-	  Node *nn = NewHash();
-	  Setattr(nn,"nodeType","classforward");
-	  Setattr(nn,"kind","class");
-	  Setattr(nn,"sym:name",tok_name);
-	  Setattr(nn,"name",tok_key);
-	  Setattr(nn,"allegrocl:package",current_namespace);
-
-	  add_forward_referenced_type(nn, 0);
-	  // tok_name is dangling here, unused. ouch. why?
-	  Printf(ffiType, "%s", get_ffi_type(n, tok, ""), tok_name);
-	}
-      }
-    }
-  }
-  return ffiType;
-}
-
-String *compose_foreign_type(Node *n, SwigType *ty, String * /*id*/ = 0) {
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "compose_foreign_type: ENTER (%s)...\n ", ty);
-  // Printf(stderr, "compose_foreign_type: ENTER (%s)(%s)...\n ", ty, (id ? id : 0));
-  /* String *id_ref = SwigType_str(ty, id);
-  Printf(stderr, "looking up typemap for %s, found '%s'(%p)\n",
-	 id_ref, lookup_res ? Getattr(lookup_res, "code") : 0, lookup_res);
-  if (lookup_res) Swig_print_node(lookup_res);
-  */
-#endif
-
-  /* should we allow named lookups in the typemap here? YES! */
-  /* unnamed lookups should be found in get_ffi_type, called
-     by internal_compose_foreign_type(), below. */
-
-  /* I'm reverting to 'no' for the question above. I can no longer
-     remember why I needed it. If a user needed it, I'll find out
-     as soon as they upgrade. Sigh. -mutandiz 9/16/2008. */
-
-/*
-  if(id && lookup_res) {
-#ifdef ALLEGROCL_TYPE_DEBUG
-    Printf(stderr, "compose_foreign_type: EXIT-1 (%s)\n ", Getattr(lookup_res, "code"));
-#endif
-    return NewString(Getattr(lookup_res, "code"));
-  }
-*/
-
-  SwigType *temp = SwigType_strip_qualifiers(ty);
-  String *res = internal_compose_foreign_type(n, temp);
-  Delete(temp);
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "compose_foreign_type: EXIT (%s)\n ", res);
-#endif
-
-  return res;
-}
-
-void update_package_if_needed(Node *n, File *f = f_clwrap) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "update_package: ENTER... \n");
-  Printf(stderr, "  current_package = '%s'\n", current_package);
-  Printf(stderr, "     node_package = '%s'\n", Getattr(n, "allegrocl:package"));
-  Printf(stderr, "   node(%p) = '%s'\n", n, Getattr(n, "name"));
-#endif
-  String *node_package = Getattr(n, "allegrocl:package");
-  if (Strcmp(current_package, node_package)) {
-    String *lispy_package = listify_namespace(node_package);
-
-    Delete(current_package);
-    current_package = Copy(node_package);
-    Printf(f, "\n(swig-in-package %s)\n", lispy_package);
-    Delete(lispy_package);
-  }
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "update_package: EXIT.\n");
-#endif
-}
-
-static String *mangle_name(Node *n, char const *prefix = "ACL", String *ns = current_namespace) {
-  String *suffix = Getattr(n, "sym:overname");
-  String *pre_mangled_name = NewStringf("%s_%s__%s%s", prefix, ns, Getattr(n, "sym:name"), suffix);
-  String *mangled_name = Swig_name_mangle(pre_mangled_name);
-  Delete(pre_mangled_name);
-  return mangled_name;
-}
-
-/* utilities */
-
-/* remove a pointer from ffitype. non-destructive. 
-   (* :char) ==> :char
-   (* (:array :int 30)) ==> (:array :int 30) */
-String *dereference_ffitype(String *ffitype) {
-   char *start;
-   char *temp = Char(ffitype);
-   String *reduced_type = 0;
-
-   if(temp && temp[0] == '(' && temp[1] == '*') {
-      temp += 2;
-
-      // walk past start of pointer references
-      while(*temp == ' ') temp++;
-      start = temp;
-      // temp = Char(reduced_type);
-      reduced_type = NewString(start);
-      temp = Char(reduced_type);
-      // walk to end of string. remove closing paren
-      while(*temp != '\0') temp++;
-      *(--temp) = '\0';
-   }
-
-   return reduced_type ? reduced_type : Copy(ffitype);
-}
-
-/* returns new string w/ parens stripped */
-String *strip_parens(String *string) {
-  string = Copy(string);
-  Replaceall(string, "(", "");
-  Replaceall(string, ")", "");
-  return string;
-}
-
-int ALLEGROCL::validIdentifier(String *s) {
-#ifdef ALLEGROCL_DEBUG
-	Printf(stderr, "validIdentifier %s\n", s);
-#endif
-
-  char *c = Char(s);
-
-  bool got_dot = false;
-  bool only_dots = true;
-
-  /* Check that s is a valid common lisp symbol. There's a lot of leeway here.
-     A common lisp symbol is essentially any token that's not a number and
-     does not consist of only dots. 
-
-     We are expressly not allowing spaces in identifiers here, but spaces
-     could be added via the identifier converter. */
-  while (*c) {
-    if (*c == '.') {
-      got_dot = true;
-    } else {
-      only_dots = false;
-    }
-    if (!isgraph(*c))
-      return 0;
-    c++;
-  }
-
-  return (got_dot && only_dots) ? 0 : 1;
-}
-
-String *infix_to_prefix(String *val, char split_op, const String *op, String *type) {
-  List *ored = Split(val, split_op, -1);
-
-  // some float hackery
-  if (((split_op == '+') || (split_op == '-')) && Len(ored) == 2 &&
-      (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE)) {
-    // check that we're not splitting a float
-    String *possible_result = convert_literal(val, type, false);
-    if (possible_result)
-      return possible_result;
-
-  }
-  // try parsing the split results. if any part fails, kick out.
-  bool part_failed = false;
-  if (Len(ored) > 1) {
-    String *result = NewStringf("(%s", op);
-    for (Iterator i = First(ored); i.item; i = Next(i)) {
-      String *converted = convert_literal(i.item, type);
-      if (converted) {
-	Printf(result, " %s", converted);
-	Delete(converted);
-      } else {
-	part_failed = true;
-	break;
-      }
-    }
-    Printf(result, ")");
-    Delete(ored);
-    return part_failed ? 0 : result;
-  }
-  Delete(ored);
-  return 0;
-}
-
-/* To be called by code generating the lisp interface
-   Will return a containing the literal based on type.
-   Will return null if there are problems.
-
-   try_to_split defaults to true (see stub above).
- */
-String *convert_literal(String *literal, String *type, bool try_to_split) {
-  String *num_param = Copy(literal);
-  String *trimmed = trim(num_param);
-  String *num = strip_parens(trimmed), *res = 0;
-  char *s = Char(num);
-
-  String *ns = listify_namespace(current_namespace);
-
-  // very basic parsing of infix expressions.
-  if (try_to_split && SwigType_type(type) != T_STRING) {
-    if ((res = infix_to_prefix(num, '|', "logior", type)))
-      return res;
-    if ((res = infix_to_prefix(num, '&', "logand", type)))
-      return res;
-    if ((res = infix_to_prefix(num, '^', "logxor", type)))
-      return res;
-    if ((res = infix_to_prefix(num, '*', "*", type)))
-      return res;
-    if ((res = infix_to_prefix(num, '/', "/", type)))
-      return res;
-    if ((res = infix_to_prefix(num, '+', "+", type)))
-      return res;
-    if ((res = infix_to_prefix(num, '-', "-", type)))
-      return res;
-    // if ((res = infix_to_prefix(num, '~', "lognot", type))) return res;
-    //  if( (res = infix_to_prefix(num, '<<', "ash", type)) ) return res;  
-  }
-
-  // unary complement...
-  if (s[0] == '~' && Len(num) >= 2) {
-    String *id = NewString(++s);
-    String *id_conv = convert_literal(id, type, false);
-    Delete(id);
-    if (id_conv) 
-      return NewStringf("(lognot %s)", id_conv);
-    s--;
-  }
-
-  if (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE) {
-    // Use CL syntax for float literals 
-    String *oldnum = Copy(num);
-
-    // careful. may be a float identifier or float constant.
-    char *num_start = Char(num);
-    char *num_end = num_start + strlen(num_start) - 1;
-
-    bool is_literal = isdigit(*num_start) || (*num_start == '.');
-
-    String *lisp_exp = 0;
-    if (is_literal) {
-      if (*num_end == 'f' || *num_end == 'F') {
-	lisp_exp = NewString("f");
-      } else {
-	lisp_exp = NewString("d");
-      }
-
-      if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') {
-	*num_end = '\0';
-	num_end--;
-      }
-
-      int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp);
-
-      if (!exponents)
-	Printf(num, "%s0", lisp_exp);
-
-      if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) {
-	// Printf(stderr, "Can't parse '%s' as type '%s'.\n", oldnum, type);
-	Delete(num);
-	num = 0;
-      }
-      Delete(lisp_exp);
-    } else {
-      String *id = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)",
-			      num, ns);
-      Delete(num);
-      num = id;
-    }
-
-    Delete(oldnum);
-    Delete(trimmed);
-    Delete(ns);
-    return num;
-  } else if (SwigType_type(type) == T_CHAR) {
-    /* Use CL syntax for character literals */
-    Delete(num);
-    Delete(trimmed);
-    return NewStringf("#\\%s", num_param);
-  } else if (SwigType_type(type) == T_STRING) {
-    /* Use CL syntax for string literals */
-    Delete(num);
-    Delete(trimmed);
-    return NewStringf("\"%s\"", num_param);
-  } else if (Len(num) >= 1 && (isdigit(s[0]) || s[0] == '+' || s[0] == '-')) {
-    /* use CL syntax for numbers */
-    String *oldnum = Copy(num);
-    int usuffixes = Replaceall(num, "u", "") + Replaceall(num, "U", "");
-    int lsuffixes = Replaceall(num, "l", "") + Replaceall(num, "L", "");
-    if (usuffixes > 1 || lsuffixes > 1) {
-      Printf(stderr, "Weird!! number %s looks invalid.\n", oldnum);
-      SWIG_exit(EXIT_FAILURE);
-    }
-    s = Char(num);
-    if (s[0] == '0' && Len(num) >= 2) {
-      /*octal or hex */
-      res = NewStringf("#%c%s", tolower(s[1]) == 'x' ? 'x' : 'o', s + 2);
-      Delete(num);
-    } else {
-      res = num;
-    }
-    Delete(oldnum);
-    Delete(trimmed);
-    return res;
-  } else if (allegrocl->validIdentifier(num)) {
-    /* convert C/C++ identifiers to CL symbols */
-    res = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", num, ns);
-    Delete(num);
-    Delete(trimmed);
-    Delete(ns);
-    return res;
-  } else {
-    Delete(trimmed);
-    return num;
-  }
-}
-
-
-void emit_stub_class(Node *n) {
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_stub_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n);
-  Swig_print_node(n);
-#endif
-
-
-  String *name = Getattr(n, "sym:name");
-
-  if (Getattr(n, "allegrocl:synonym:already-been-stubbed"))
-    return;
-
-  String *tname = SwigType_istemplate_templateprefix(name);
-  if (tname) {
-    String *temp = strip_namespaces(tname);
-    name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name));
-    Delete(temp);
-    Delete(tname);
-  } else {
-    name = strip_namespaces(name);
-  }
-
-  // Printf(f_clhead, ";; from emit-stub-class\n");
-  update_package_if_needed(n, f_clhead);
-  Printf(f_clhead, ";; class template stub.\n");
-  Printf(f_clhead, "(swig-def-foreign-stub \"%s\")\n", name);
-
-  Setattr(n, "allegrocl:synonym:already-been-stubbed", "1");
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_stub_class: EXIT\n");
-#endif
-}
-
-void emit_synonym(Node *synonym) {
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_synonym: ENTER... \n");
-#endif
-
-  // Printf(stderr,"in emit_synonym for %s(%p)\n", Getattr(synonym,"name"),synonym);
-  int is_tempInst = !Strcmp(nodeType(synonym), "templateInst");
-  String *synonym_type;
-
-  Node *of = get_primary_synonym_of(synonym);
-
-  if (is_tempInst) {
-    // Printf(stderr, "*** using real-name '%s'\n", Getattr(synonym,"real-name"));
-    synonym_type = Getattr(synonym, "real-name");
-  } else {
-    // Printf(stderr, "*** using name '%s'\n", Getattr(synonym,"name"));
-    synonym_type = Getattr(synonym, "name");
-  }
-
-  String *synonym_ns = listify_namespace(Getattr(synonym, "allegrocl:namespace"));
-  String *syn_ltype, *syn_type, *of_ltype;
-  // String *of_cdeclname = Getattr(of,"allegrocl:classDeclarationName");
-  String *of_ns = Getattr(of, "allegrocl:namespace");
-  String *of_ns_list = listify_namespace(of_ns);
-  // String *of_name = of_cdeclname ? NewStringf("struct %s", Getattr(of,"name")) : NewStringf("%s::%s", of_ns, Getattr(of,"sym:name"));
-  // String *of_name = NewStringf("%s::%s", of_ns, Getattr(of,"sym:name"));
-  String *of_name = namespaced_name(of, of_ns);
-
-  if (CPlusPlus && !Strcmp(nodeType(synonym), "cdecl")) {
-    String *real_name = Getattr(synonym, "real-name");
-    if (!real_name)
-      real_name = NewString("Unknown"); // TODO: fix
-    syn_ltype = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", strip_namespaces(real_name), synonym_ns);
-    syn_type = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", strip_namespaces(real_name), synonym_ns);
-  } else {
-    syn_ltype = lookup_defined_foreign_ltype(synonym_type);
-    syn_type = lookup_defined_foreign_type(synonym_type);
-  }
-
-  of_ltype = lookup_defined_foreign_ltype(of_name);
-
-  // Printf(stderr,";; from emit-synonym syn='%s' of_ltype='%s'\n", syn_ltype, of_ltype);
-  if( of_ltype )
-      Printf(f_clhead, "(swig-def-synonym-type %s\n   %s\n   %s)\n", syn_ltype, of_ltype, syn_type);
-
-  Delete(synonym_ns);
-  Delete(of_ns_list);
-  Delete(of_name);
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_synonym: EXIT\n");
-#endif
-}
-
-void emit_full_class(Node *n) {
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_full_class: ENTER... \n");
-#endif
-
-  String *name = Getattr(n, "sym:name");
-  String *kind = Getattr(n, "kind");
-
-  // Printf(stderr,"in emit_full_class: '%s'(%p).", Getattr(n,"name"),n);
-  if (Getattr(n, "allegrocl:synonym-of")) {
-    // Printf(stderr,"but it's a synonym of something.\n");
-    update_package_if_needed(n, f_clhead);
-    emit_synonym(n);
-    return;
-  }
-  // collect superclasses
-  String *bases = Getattr(n, "bases");
-  String *supers = NewString("(");
-  if (bases) {
-    int first = 1;
-    for (Iterator i = First(bases); i.item; i = Next(i)) {
-      if (!first)
-	Printf(supers, " ");
-      String *s = lookup_defined_foreign_ltype(Getattr(i.item, "name"));
-      // String *name = Getattr(i.item,"name");
-      if (s) {
-	Printf(supers, "%s", s);
-      } else {
-#ifdef ALLEGROCL_TYPE_DEBUG
-	Printf(stderr, "emit_templ_inst: did not find ltype for base class %s (%s)", Getattr(i.item, "name"), Getattr(n, "allegrocl:namespace"));
-#endif
-      }
-    }
-  } else {
-    Printf(supers, "ff:foreign-pointer");
-  }
-
-  // check for "feature:aclmixins" and add those as well.
-  Printf(supers, " %s)", Getattr(n,"feature:aclmixins"));
-
-  // Walk children to generate type definition.
-  String *slotdefs = NewString("   ");
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "  walking children...\n");
-#endif
-
-  Node *c;
-  for (c = firstChild(n); c; c = nextSibling(c)) {
-    String *storage_type = Getattr(c, "storage");
-    if ((!Strcmp(nodeType(c), "cdecl") && (!storage_type || Strcmp(storage_type, "typedef")))) {
-      String *access = Getattr(c, "access");
-
-      // hack. why would decl have a value of "variableHandler" and now "0"?
-      String *childDecl = Getattr(c, "decl");
-      // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view"));
-      if (!childDecl || !Strcmp(childDecl, "0"))
-	childDecl = NewString("");
-
-      SwigType *childType;
-      String *cname;
-
-      // don't include types for private slots (yet). spr33959.
-      if(access && Strcmp(access,"public")) {
-	      childType = NewStringf("int");
-	      cname = NewString("nil");
-      } else {
-	      childType = NewStringf("%s%s", childDecl, Getattr(c, "type"));
-	      cname = Copy(Getattr(c, "name"));
-      }
-
-      if (!SwigType_isfunction(childType)) {
-	// Printf(slotdefs, ";;; member functions don't appear as slots.\n ");
-	// Printf(slotdefs, ";; ");
-	String *ns = listify_namespace(Getattr(n, "allegrocl:package"));
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-	Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType);
-#endif
-	Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, compose_foreign_type(n, childType));
-	Delete(ns);
-	if (access && Strcmp(access, "public"))
-	  Printf(slotdefs, " ;; %s member", access);
-
-	Printf(slotdefs, "\n   ");
-      }
-      Delete(childType);
-      Delete(cname);
-    }
-  }
-
-  String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace"));
-  update_package_if_needed(n, f_clhead);
-  Printf(f_clhead, "(swig-def-foreign-class \"%s\"\n %s\n  (:%s\n%s))\n\n", name, supers, kind, slotdefs);
-
-  Delete(supers);
-  Delete(ns_list);
-
-  Setattr(n, "allegrocl:synonym:already-been-stubbed", "1");
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_full_class: EXIT\n");
-#endif
-
-}
-
-void emit_class(Node *n) {
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n);
-#endif
-
-  int is_tempInst = !Strcmp(nodeType(n), "templateInst");
-
-  String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace"));
-  String *name = Getattr(n, is_tempInst ? "real-name" : "name");
-
-  String *tname = SwigType_istemplate_templateprefix(name);
-  if (tname) {
-    String *temp = strip_namespaces(tname);
-    name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name));
-    Delete(temp);
-    Delete(tname);
-  } else {
-    name = strip_namespaces(name);
-  }
-
-  if (Getattr(n, "allegrocl:synonym:is-primary")) {
-    // Printf(stderr,"  is primary... ");
-    if (is_tempInst) {
-      emit_stub_class(n);
-    } else {
-      emit_full_class(n);
-    }
-  } else {
-    // Node *primary = Getattr(n,"allegrocl:synonym-of");
-    Node *primary = get_primary_synonym_of(n);
-    if (primary && (primary != n)) {
-      // Printf(stderr,"  emitting synonym... ");
-      emit_stub_class(primary);
-      update_package_if_needed(n, f_clhead);
-      emit_synonym(n);
-    } else {
-      emit_full_class(n);
-    }
-  }
-  // Printf(stderr,"DONE\n");
-  Delete(name);
-  Delete(ns_list);
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_class: EXIT\n");
-#endif
-}
-
-void emit_typedef(Node *n) {
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_typedef: ENTER... \n");
-#endif
-
-  String *name;
-  String *sym_name = Getattr(n, "sym:name");
-  String *type = NewStringf("%s%s", Getattr(n, "decl"), Getattr(n, "type"));
-  String *lisp_type = compose_foreign_type(n, type);
-  Delete(type);
-  Node *in_class = Getattr(n, "allegrocl:typedef:in-class");
-
-  // Printf(stderr,"in emit_typedef: '%s'(%p).",Getattr(n,"name"),n);
-  if (Getattr(n, "allegrocl:synonym-of")) {
-    // Printf(stderr," but it's a synonym of something.\n");
-    emit_synonym(n);
-    return;
-  }
-
-  if (in_class) {
-    String *class_name = Getattr(in_class, "name");
-    String *tname = SwigType_istemplate_templateprefix(class_name);
-    if (tname) {
-      String *temp = strip_namespaces(tname);
-      class_name = NewStringf("%s%s%s", temp, SwigType_templateargs(class_name), SwigType_templatesuffix(class_name));
-      Delete(temp);
-      Delete(tname);
-    }
-
-    name = NewStringf("%s__%s", class_name, sym_name);
-    Setattr(n, "allegrocl:in-class", in_class);
-  } else {
-    name = sym_name ? Copy(sym_name) : Copy(Getattr(n, "name"));
-  }
-
-  // leave these in for now. might want to change these to def-foreign-class at some point.
-//  Printf(f_clhead, ";; %s\n", SwigType_typedef_resolve_all(lisp_type));
-  Printf(f_clhead, "(swig-def-foreign-type \"%s\"\n  %s)\n", name, lisp_type);
-
-  Delete(name);
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_typedef: EXIT\n");
-#endif
-}
-
-void emit_enum_type_no_wrap(Node *n) {
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_enum_type_no_wrap: ENTER... \n");
-#endif
-
-  String *unnamed = Getattr(n, "unnamed");
-  String *name;
-  //  SwigType *enumtype;
-
-  name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name");
-  SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name);
-
-  Node *node = NewHash();
-  Setattr(node, "type", tmp);
-  Setfile(node, Getfile(n));
-  Setline(node, Getline(n));
-  const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0);
-  Delete(node);
-
-  Delete(tmp);
-
-  if (name) {
-    String *ns = listify_namespace(current_namespace);
-
-    Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype);
-    Delete(ns);
-
-    // walk children.
-    Node *c;
-    for (c = firstChild(n); c; c = nextSibling(c)) {
-      if (!Getattr(c, "error")) {
-	String *val = Getattr(c, "enumvalue");
-	if (!val)
-	  val = Getattr(c, "enumvalueex");
-	String *converted_val = convert_literal(val, Getattr(c, "type"));
-	String *valname = Getattr(c, "sym:name");
-
-	if (converted_val) {
-	  Printf(f_clhead, "(swig-defconstant \"%s\" %s)\n", valname, converted_val);
-	  Delete(converted_val);
-	} else {
-	  Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse enum value '%s'. Setting to NIL\n", val);
-	  Printf(f_clhead, "(swig-defconstant \"%s\" nil #| %s |#)\n", valname, val);
-	}
-      }
-    }
-  }
-  Printf(f_clhead, "\n");
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_enum_type_no_wrap: EXIT\n");
-#endif
-
-}
-
-void emit_enum_type(Node *n) {
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_enum_type: ENTER... \n");
-#endif
-
-  if (!Generate_Wrapper) {
-    emit_enum_type_no_wrap(n);
-    return;
-  }
-
-  String *unnamed = Getattr(n, "unnamed");
-  String *name;
-  // SwigType *enumtype;
-
-  name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name");
-  SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name);
-
-  Node *node = NewHash();
-  Setattr(node, "type", tmp);
-  Setfile(node, Getfile(n));
-  Setline(node, Getline(n));
-  const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0);
-  Delete(node);
-
-  Delete(tmp);
-
-  if (name) {
-    String *ns = listify_namespace(current_namespace);
-
-    Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype);
-    Delete(ns);
-
-    // walk children.
-    Node *c;
-    for(c = firstChild(n); c; c=nextSibling(c)) {
-      String *mangled_name = mangle_name(c, "ACL_ENUM", Getattr(c,"allegrocl:package"));
-      Printf(f_clhead, "(swig-defvar \"%s\" \"%s\" :type :constant :ftype :signed-long)\n", Getattr(c, "sym:name"), mangled_name);
-      Delete(mangled_name);
-    }
-  }
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_enum_type: EXIT\n");
-#endif
-
-}
-
-void emit_default_linked_type(Node *n) {
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_default_linked_type: ENTER... \n");
-#endif
-
-  // catchall for non class types.
-  if (!Strcmp(nodeType(n), "classforward")) {
-    Printf(f_clhead, ";; forward referenced stub.\n");
-    Printf(f_clhead, "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n", Getattr(n, "sym:name"));
-  } else if (!Strcmp(nodeType(n), "enum")) {
-    emit_enum_type(n);
-  } else {
-    Printf(stderr, "Don't know how to emit node type '%s' named '%s'\n", nodeType(n), Getattr(n, "name"));
-  }
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_default_linked_type: EXIT\n");
-#endif
-
-}
-
-void dump_linked_types(File *f) {
-  Node *n = first_linked_type;
-  int i = 0;
-  while (n) {
-    Printf(f, "%d: (%p) node '%s' name '%s'\n", i++, n, nodeType(n), Getattr(n, "sym:name"));
-
-    Node *t = Getattr(n, "allegrocl:synonym-of");
-    if (t)
-      Printf(f, "     synonym-of %s(%p)\n", Getattr(t, "name"), t);
-    n = Getattr(n, "allegrocl:next_linked_type");
-  }
-}
-
-void emit_linked_types() {
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_linked_types: ENTER... ");
-#endif
-
-  Node *n = first_linked_type;
-
-  while (n) {
-    String *node_type = nodeType(n);
-
-    // Printf(stderr,"emitting node %s(%p) of type %s.", Getattr(n,"name"),n, nodeType(n));
-    if (!Strcmp(node_type, "class") || !Strcmp(node_type, "templateInst")) {
-      // may need to emit a stub, so it will update the package itself.
-      // Printf(stderr," Passing to emit_class.");
-      emit_class(n);
-    } else if (!Strcmp(nodeType(n), "cdecl")) {
-      // Printf(stderr," Passing to emit_typedef.");
-      update_package_if_needed(n, f_clhead);
-      emit_typedef(n);
-    } else {
-      // Printf(stderr," Passing to default_emitter.");
-      update_package_if_needed(n, f_clhead);
-      emit_default_linked_type(n);
-    }
-
-    n = Getattr(n, "allegrocl:next_linked_type");
-    // Printf(stderr,"returned.\n");
-  }
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_linked_types: EXIT\n");
-#endif
-}
-
-extern "C" Language *swig_allegrocl(void) {
-  return (allegrocl = new ALLEGROCL());
-}
-
-void ALLEGROCL::main(int argc, char *argv[]) {
-  int i;
-
-  Preprocessor_define("SWIGALLEGROCL 1", 0);
-  SWIG_library_directory("allegrocl");
-  SWIG_config_file("allegrocl.swg");
-
-  for (i = 1; i < argc; i++) {
-    if (!strcmp(argv[i], "-identifier-converter")) {
-      char *conv = argv[i + 1];
-
-      if (!conv)
-	Swig_arg_error();
-
-      Swig_mark_arg(i);
-      Swig_mark_arg(i + 1);
-      i++;
-
-      /* check for built-ins */
-      if (!strcmp(conv, "lispify")) {
-	Delete(identifier_converter);
-	identifier_converter = NewString("identifier-convert-lispify");
-      } else if (!strcmp(conv, "null")) {
-	Delete(identifier_converter);
-	identifier_converter = NewString("identifier-convert-null");
-      } else {
-	/* Must be user defined */
-	Delete(identifier_converter);
-	identifier_converter = NewString(conv);
-      }
-    } else if (!strcmp(argv[i], "-cwrap")) {
-      CWrap = true;
-      Swig_mark_arg(i);
-    } else if (!strcmp(argv[i], "-nocwrap")) {
-      CWrap = false;
-      Swig_mark_arg(i);
-    } else if (!strcmp(argv[i], "-isolate")) {
-      unique_swig_package = true;
-      Swig_mark_arg(i);
-    }
-
-    if (!strcmp(argv[i], "-help")) {
-      Printf(stdout, "%s\n", usage);
-    }
-
-  }
-
-  allow_overloading();
-}
-
-int ALLEGROCL::top(Node *n) {
-  module_name = Getattr(n, "name");
-  String *cxx_filename = Getattr(n, "outfile");
-  String *cl_filename = NewString("");
-
-  swig_package = unique_swig_package ? NewStringf("swig.%s", module_name) : NewString("swig");
-
-  Printf(cl_filename, "%s%s.cl", SWIG_output_directory(), module_name);
-
-  f_cl = NewFile(cl_filename, "w", SWIG_output_files());
-  if (!f_cl) {
-    Printf(stderr, "Unable to open %s for writing\n", cl_filename);
-    SWIG_exit(EXIT_FAILURE);
-  }
-
-  Generate_Wrapper = CPlusPlus || CWrap;
-
-  if (Generate_Wrapper) {
-    f_begin = NewFile(cxx_filename, "w", SWIG_output_files());
-    if (!f_begin) {
-      Delete(f_cl);
-      Printf(stderr, "Unable to open %s for writing\n", cxx_filename);
-      SWIG_exit(EXIT_FAILURE);
-    }
-  } else
-    f_begin = NewString("");
-
-  f_runtime = NewString("");
-  f_cxx_header = f_runtime;
-  f_cxx_wrapper = NewString("");
-
-  Swig_register_filebyname("header", f_cxx_header);
-  Swig_register_filebyname("wrapper", f_cxx_wrapper);
-  Swig_register_filebyname("begin", f_begin);
-  Swig_register_filebyname("runtime", f_runtime);
-  Swig_register_filebyname("lisp", f_clwrap);
-  Swig_register_filebyname("lisphead", f_cl);
-
-  Swig_banner(f_begin);
-
-  Printf(f_runtime, "\n\n#ifndef SWIGALLEGROCL\n#define SWIGALLEGROCL\n#endif\n\n");
-
-  Swig_banner_target_lang(f_cl, ";;");
-
-  Printf(f_cl, "\n"
-	 "(defpackage :%s\n"
-	 "  (:use :common-lisp :ff :excl)\n"
-	 "  (:export #:*swig-identifier-converter* #:*swig-module-name*\n"
-	 "           #:*void* #:*swig-export-list*))\n"
-	 "(in-package :%s)\n\n"
-	 "(eval-when (:compile-toplevel :load-toplevel :execute)\n"
-	 "  (defparameter *swig-identifier-converter* '%s)\n"
-	 "  (defparameter *swig-module-name* :%s))\n\n", swig_package, swig_package, identifier_converter, module_name);
-  Printf(f_cl, "(defpackage :%s\n" "  (:use :common-lisp :%s :ff :excl))\n\n", module_name, swig_package);
-
-  Printf(f_clhead, "(in-package :%s)\n", module_name);
-
-  Language::top(n);
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-  dump_linked_types(stderr);
-#endif
-  emit_linked_types();
-
-  Printf(f_clwrap, "\n(cl::in-package :%s)\n", swig_package);
-  Printf(f_clwrap, "\n(macrolet ((swig-do-export ()\n");
-  Printf(f_clwrap, "                 `(dolist (s ',*swig-export-list*)\n");
-  Printf(f_clwrap, "                    (apply #'export s))))\n");
-  Printf(f_clwrap, "   (swig-do-export))\n");
-  Printf(f_clwrap, "\n(setq *swig-export-list* nil)\n");
-
-  Printf(f_cl, "%s\n", f_clhead);
-  Printf(f_cl, "%s\n", f_clwrap);
-
-  Delete(f_cl);
-  Delete(f_clhead);
-  Delete(f_clwrap);
-
-  Dump(f_runtime, f_begin);
-  Printf(f_begin, "%s\n", f_cxx_wrapper);
-
-  Delete(f_runtime);
-  Delete(f_begin);
-  Delete(f_cxx_wrapper);
-
-  // Swig_print_tree(n);
-
-  return SWIG_OK;
-}
-
-int any_varargs(ParmList *pl) {
-  Parm *p;
-
-  for (p = pl; p; p = nextSibling(p)) {
-    if (SwigType_isvarargs(Getattr(p, "type")))
-      return 1;
-  }
-
-  return 0;
-}
-
-String *get_lisp_type(Node *n, SwigType *ty, const_String_or_char_ptr name) {
-  Node *node = NewHash();
-  Setattr(node, "type", ty);
-  Setattr(node, "name", name);
-  Setfile(node, Getfile(n));
-  Setline(node, Getline(n));
-  const String *tm = Swig_typemap_lookup("lisptype", node, "", 0);
-  Delete(node);
-
-  return tm ? NewString(tm) : NewString("");
-}
-
-Node *parent_node_skipping_extends(Node *n) {
-  Node *result = n;
-  do {
-    result = parentNode(result);
-  }
-  while (Cmp("extend", nodeType(result)) == 0);
-  return result;
-}
-
-/* -----------------------------------------------------------------------------
- * emit_num_lin_arguments()
- *
- * Calculate the total number of arguments.   This function is safe for use
- * with multi-argument typemaps which may change the number of arguments in
- * strange ways.
- * ----------------------------------------------------------------------------- */
-
-int emit_num_lin_arguments(ParmList *parms) {
-  Parm *p = parms;
-  int nargs = 0;
-
-  while (p) {
-    // Printf(stderr,"enla: '%s' lin='%p' numinputs='%s'\n", Getattr(p,"name"), Getattr(p,"tmap:lin"), Getattr(p,"tmap:lin:numinputs"));
-    if (Getattr(p, "tmap:lin")) {
-      nargs += GetInt(p, "tmap:lin:numinputs");
-      p = Getattr(p, "tmap:lin:next");
-    } else {
-      p = nextSibling(p);
-    }
-  }
-
-  /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */
-  /*
-     if (parms && (p = Getattr(parms,"emit:varargs"))) {
-     if (!nextSibling(p)) {
-     nargs--;
-     }
-     }
-   */
-  return nargs;
-}
-
-String *id_converter_type(SwigType const *type) {
-  SwigType *t = Copy(type);
-  String *result = 0;
-
-  if (SwigType_ispointer(t)) {
-    SwigType_pop(t);
-    String *pointee = id_converter_type(t);
-    result = NewStringf("(:* %s)", pointee);
-    Delete(pointee);
-  } else if (SwigType_ismemberpointer(t)) {
-    String *klass = SwigType_parm(t);
-    SwigType_pop(t);
-    String *member = id_converter_type(t);
-    result = NewStringf("(:member \"%s\" %s)", klass, member);
-    Delete(klass);
-    Delete(member);
-  } else if (SwigType_isreference(t)) {
-    SwigType_pop(t);
-    String *referencee = id_converter_type(t);
-    result = NewStringf("(:& %s)", referencee);
-    Delete(referencee);
-  } else if (SwigType_isarray(t)) {
-    String *size = SwigType_parm(t);
-    SwigType_pop(t);
-    String *element_type = id_converter_type(t);
-    result = NewStringf("(:array %s \"%s\")", element_type, size);
-    Delete(size);
-    Delete(element_type);
-  } else if (SwigType_isfunction(t)) {
-    result = NewString("(:function (");
-    String *parmlist_str = SwigType_parm(t);
-    List *parms = SwigType_parmlist(parmlist_str);
-
-    for (Iterator i = First(parms); i.item;) {
-      String *parm = id_converter_type((SwigType *) i.item);
-      Printf(result, "%s", parm);
-      i = Next(i);
-      if (i.item)
-	Printf(result, " ");
-      Delete(parm);
-    }
-    SwigType_pop(t);
-    String *ret = id_converter_type(t);
-    Printf(result, ") %s)", ret);
-
-    Delete(parmlist_str);
-    Delete(parms);
-    Delete(ret);
-  } else if (SwigType_isqualifier(t)) {
-    result = NewString("(:qualified (");
-    String *qualifiers_str = Copy(SwigType_parm(t));	// ?!
-    // Replaceall below SEGVs if we don't put the Copy here...
-    SwigType_pop(t);
-    String *qualifiee = id_converter_type(t);
-
-    Replaceall(qualifiers_str, " ", " :");
-    if (Len(qualifiers_str) > 0)
-      Printf(result, ":");
-    Printf(result, "%s) %s)", qualifiers_str, qualifiee);
-
-    Delete(qualifiers_str);
-    Delete(qualifiee);
-  } else if (SwigType_istemplate(t)) {
-    result = NewStringf("(:template \"%s\")", t);
-  } else {			/* if (SwigType_issimple(t)) */
-
-    if (Strstr(Char(t), "::")) {
-      result = listify_namespace(t);
-    } else {
-      result = NewStringf("\"%s\"", t);
-    }
-  }
-
-  Delete(t);
-  return result;
-}
-
-static ParmList *parmlist_with_names(ParmList *pl) {
-  ParmList *pl2 = CopyParmList(pl);
-  for (Parm *p = pl, *p2 = pl2; p2; p = nextSibling(p), p2 = nextSibling(p2)) {
-    if (!Getattr(p2, "name"))
-      Setattr(p2, "name", Getattr(p2, "lname"));
-    Setattr(p2, "name", strip_namespaces(Getattr(p2, "name")));
-    Setattr(p2, "tmap:ctype", Getattr(p, "tmap:ctype"));
-
-    String *temp = Getattr(p, "tmap:lin");
-    if (temp) {
-      Setattr(p2, "tmap:lin", temp);
-      Setattr(p2, "tmap:lin:next", Getattr(p, "tmap:lin:next"));
-    }
-  }
-  return pl2;
-}
-
-static String *parmlist_str_id_converter(ParmList *pl) {
-  String *result = NewString("");
-  for (Parm *p = pl; p;) {
-    String *lispy_type = id_converter_type(Getattr(p, "type"));
-    Printf(result, "(\"%s\" %s)", Getattr(p, "name"), lispy_type);
-    Delete(lispy_type);
-    if ((p = nextSibling(p)))
-      Printf(result, " ");
-  }
-  return result;
-}
-
-String *collect_others_args(Node *overload) {
-  String *overloaded_from = Getattr(overload, "sym:overloaded");
-  String *others_args = NewString("");
-  int first_overload = 1;
-
-  for (Node *overload2 = overloaded_from; overload2; overload2 = Getattr(overload2, "sym:nextSibling")) {
-    if (overload2 == overload || GetInt(overload2, "overload:ignore"))
-      continue;
-
-    ParmList *opl = parmlist_with_names(Getattr(overload2, "wrap:parms"));
-    String *args = parmlist_str_id_converter(opl);
-    if (!first_overload)
-      Printf(others_args, "\n                           ");
-    Printf(others_args, "(%s)", args);
-    Delete(args);
-    Delete(opl);
-    first_overload = 0;
-  }
-  return others_args;
-}
-
-struct IDargs {
-  String *name;
-  String *type;
-  String *klass;
-  String *arity;
-
-  IDargs():name(0), type(0), klass(0), arity(0) {
-  }
-
-  String *full_quoted_str() {
-    String *result = no_others_quoted_str();
-    if (arity)
-      Printf(result, " :arity %s", arity);
-    return result;
-  }
-
-  String *no_others_quoted_str() {
-    String *result = NewString("");
-    Printf(result, "\"%s\" :type :%s", name, type);
-    if (klass)
-      Printf(result, " :class \"%s\"", klass);
-    return result;
-  }
-
-  String *noname_str(bool include_class = true) {
-    String *result = NewString("");
-    Printf(result, " :type :%s", type);
-    if (klass && include_class)
-      Printf(result, " :class \"%s\"", klass);
-    if (arity)
-      Printf(result, " :arity %s", arity);
-    return result;
-  }
-
-  String *noname_no_others_str(bool include_class = true) {
-    String *result = NewString("");
-    Printf(result, " :type :%s", type);
-    if (klass && include_class)
-      Printf(result, " :class \"%s\"", klass);
-    return result;
-  }
-};
-IDargs *id_converter_arguments(Node *n) {
-  IDargs *result = (IDargs *) GetVoid(n, "allegrocl:id-converter-args");
-  if (!result)
-    result = new IDargs;
-
-  // Base name
-  if (!result->name) {
-    result->name = Getattr(n, "allegrocl:old-sym:name");
-    if (!result->name)
-      result->name = Getattr(n, "sym:name");
-    result->name = Copy(result->name);
-  }
-  // :type
-  if (result->type)
-    Delete(result->type);
-  if (!Getattr(n, "allegrocl:kind"))
-    Setattr(n, "allegrocl:kind", "function");
-  if (Strstr(Getattr(n, "name"), "operator "))
-    Replaceall(Getattr(n, "allegrocl:kind"), "function", "operator");
-  if (Strstr(Getattr(n, "allegrocl:kind"), "variable")) {
-    int name_end = Len(Getattr(n, "sym:name")) - 4;
-    char *str = Char(Getattr(n, "sym:name"));
-    String *get_set = NewString(str + name_end + 1);
-    result->type = Copy(Getattr(n, "allegrocl:kind"));
-    Replaceall(result->type, "variable", "");
-    Printf(result->type, "%ster", get_set);
-    Delete(get_set);
-  } else {
-    result->type = Copy(Getattr(n, "allegrocl:kind"));
-  }
-
-  // :class
-  if (Strstr(result->type, "member ")) {
-    Replaceall(result->type, "member ", "");
-    if (!result->klass) {
-      result->klass = Copy(Getattr(parent_node_skipping_extends(n), "sym:name"));
-    }
-  }
-  // :arity
-  if (Getattr(n, "sym:overloaded")) {
-    if (result->arity)
-      Delete(result->arity);
-    result->arity = NewStringf("%d",
-			       // emit_num_arguments(Getattr(n, "wrap:parms")));
-			       emit_num_lin_arguments(Getattr(n, "wrap:parms")));
-    // Printf(stderr, "got arity of '%s' node '%s' '%p'\n", result->arity, Getattr(n,"name"), Getattr(n,"wrap:parms"));
-  }
-
-  SetVoid(n, "allegrocl:id-converter-args", result);
-  return result;
-}
-
-int ALLEGROCL::emit_buffered_defuns(Node *n) {
-
-  Node *overloaded_from = Getattr(n, "sym:overloaded");
-
-  String *wrap;
-
-  if (!overloaded_from) {
-    wrap = Getattr(n, "allegrocl:lisp-wrap");
-
-    Printf(f_clwrap, "%s\n", wrap);
-    Delattr(n, "allegrocl:lisp-wrap");
-    Delete(wrap);
-  } else {
-    for (Node *overload = overloaded_from; overload; overload = Getattr(overload, "sym:nextSibling")) {
-      String *others_args = collect_others_args(overload);
-      wrap = Getattr(overload, "allegrocl:lisp-wrap");
-
-      Replaceall(wrap, "@@OTHERS-ARGS-GO-HERE@@", others_args);
-//        IDargs* id_args = id_converter_arguments(overload);
-//        Replaceall(id_args->others_args, "@@OTHERS-ARGS-GO-HERE@@", others_args);
-
-      if (!GetInt(overload, "overload:ignore"))
-	Printf(f_clwrap, "%s", wrap);
-
-      Delattr(overload, "allegrocl:lisp-wrap");
-      Delete(wrap);
-    }
-  }
-  return SWIG_OK;
-}
-
-String *dispatching_type(Node *n, Parm *p) {
-  String *result = 0;
-
-  String *parsed = Getattr(p, "type");	//Swig_cparse_type(Getattr(p,"tmap:ctype"));
-  String *cl_t = SwigType_typedef_resolve_all(parsed);
-
-  Node *node = NewHash();
-  Setattr(node, "type", parsed);
-  Setfile(node, Getfile(n));
-  Setline(node, Getline(n));
-  const String *tm = Swig_typemap_lookup("lispclass", node, Getattr(p, "name"), 0);
-  Delete(node);
-
-  if (tm) {
-    result = Copy(tm);
-  } else {
-    String *lookup_type = class_from_class_or_class_ref(parsed);
-    if (lookup_type)
-      result = lookup_defined_foreign_ltype(lookup_type);
-  }
-
-  //  if (!result && SwigType_ispointer(cl_t)) {
-  //    SwigType_pop(cl_t);
-  //    result = lookup_defined_foreign_ltype(cl_t);
-  //  }
-
-  if (!result)
-    result = NewStringf("ff:foreign-pointer");
-
-  // Delete(parsed);
-  Delete(cl_t);
-  return result;
-}
-
-int ALLEGROCL::emit_dispatch_defun(Node *n) {
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_dispatch_defun: ENTER... ");
-#endif
-  List *overloads = Swig_overload_rank(n, true);
-
-  // Printf(stderr,"\ndispatch node=%p\n\n", n);
-  // Swig_print_node(n);
-
-  Node *overloaded_from = Getattr(n,"sym:overloaded");
-  bool include_class = Getattr(overloaded_from, "allegrocl:dispatcher:include-class") ? true : false;
-  String *id_args = id_converter_arguments(n)->noname_no_others_str(include_class);
-  Printf(f_clwrap, "(swig-dispatcher (\"%s\" %s :arities (", Getattr(overloaded_from, "allegrocl:dispatcher:name"), id_args);
-
-  Delattr(overloaded_from, "allegrocl:dispatcher:include-class");
-  Delattr(overloaded_from, "allegrocl:dispatcher:name");
-
-  int last_arity = -1;
-  for (Iterator i = First(overloads); i.item; i = Next(i)) {
-    int arity = emit_num_lin_arguments(Getattr(i.item, "wrap:parms"));
-    if (arity == last_arity)
-      continue;
-
-    Printf(f_clwrap, "%s%d", last_arity == -1 ? "" : " ", arity);
-
-    last_arity = arity;
-  }
-  Printf(f_clwrap, ")))\n");
-
-  Delete(id_args);
-  Delete(overloads);
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_dispatch_defun: EXIT\n");
-#endif
-
-  return SWIG_OK;
-}
-
-int ALLEGROCL::emit_defun(Node *n, File *fcl) {
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_defun: ENTER... ");
-#endif
-
-  // avoid name conflicts between smart pointer wrappers and the wrappers for the
-  // actual class.
-  bool smartmemberwrapper = (!Cmp(Getattr(n, "view"), "memberfunctionHandler") &&
-			     Getattr(n,"allocate:smartpointeraccess"));
-
-#ifdef ALLEGROCL_DEBUG
-  int auto_generated = Cmp(Getattr(n, "view"), "globalfunctionHandler");
-  Printf(stderr, "%s%sfunction %s%s%s\n", auto_generated ? "> " : "", Getattr(n, "sym:overloaded")
-	 ? "overloaded " : "", current_namespace, (current_namespace) > 0 ? "::" : "", Getattr(n, "sym:name"));
-  Printf(stderr, "  (view: %s)\n", Getattr(n, "view"));
-  Swig_print_node(n);
-#endif
-
-
-  String *funcname = Getattr(n, "allegrocl:old-sym:name");
-  if (smartmemberwrapper || !funcname)
-    funcname = Getattr(n, "sym:name");
-
-  String *mangled_name = Getattr(n, "wrap:name");
-  ParmList *pl = parmlist_with_names(Getattr(n, "wrap:parms"));
-
-  // attach typemap info.
-  Wrapper *wrap = NewWrapper();
-  Swig_typemap_attach_parms("lin", pl, wrap);
-  // Swig_typemap_attach_parms("ffitype", pl, wrap);
-  Swig_typemap_lookup("lout", n, Swig_cresult_name(), 0);
-
-  SwigType *result_type = Swig_cparse_type(Getattr(n, "tmap:ctype"));
-  // prime the pump, with support for OUTPUT, INOUT typemaps.
-  Printf(wrap->code,
-	 "(cl::let ((ACL_ffresult %s:*void*)\n        ACL_result)\n  $body\n  (cl::if (cl::eq ACL_ffresult %s:*void*)\n    (cl::values-list ACL_result)\n   (cl::values-list (cl::cons ACL_ffresult ACL_result))))",
-	 swig_package, swig_package);
-
-  Parm *p;
-  int largnum = 0, argnum = 0, first = 1;
-  // int varargs=0;
-  if (Generate_Wrapper) {
-    String *extra_parms = id_converter_arguments(n)->noname_str(smartmemberwrapper ? false : true);
-    Node *overloaded_from = Getattr(n,"sym:overloaded");
-    if (overloaded_from) {
-      if(!GetFlag(overloaded_from,"allegrocl:dispatcher:name")) {
-        Setattr(overloaded_from,"allegrocl:dispatcher:name",funcname);
-	Setattr(overloaded_from,"allegrocl:dispatcher:include-class", smartmemberwrapper ? 0 : "1");
-	// Printf(stderr, "   set a:d:name='%s', a:d:i-c='%s'\n", Getattr(n,"allegrocl:dispatcher:name"), Getattr(n,"allegrocl:dispatcher:include-class"));
-      }
-      Printf(fcl, "(swig-defmethod (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms);
-    } else
-      Printf(fcl, "(swig-defun (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms);
-    Delete(extra_parms);
-  }
-  // Just C
-  else {
-    Printf(fcl, "(swig-defun (\"%s\" \"%s\")\n", funcname, Generate_Wrapper ? mangled_name : funcname);
-  }
-
-  //////////////////////////////////////
-  // Lisp foreign call parameter list //
-  //////////////////////////////////////
-  Printf(fcl, "  (");
-
-  /* Special cases */
-
-  if (ParmList_len(pl) == 0) {
-    Printf(fcl, ":void");
-/*  } else if (any_varargs(pl)) {
-    Printf(fcl, "#| varargs |#");
-    varargs=1; */
-  } else {
-    String *largs = NewString("");
-
-    for (p = pl; p; p = nextSibling(p), argnum++, largnum++) {
-      // SwigType *argtype=Getattr(p, "type");
-      SwigType *argtype = Swig_cparse_type(Getattr(p, "tmap:ctype"));
-      SwigType *parmtype = Getattr(p,"type");
-
-      if (!first) {
-	Printf(fcl, "\n   ");
-      }
-
-      /* by default, skip varargs */
-      if (!SwigType_isvarargs(parmtype)) {
-	String *argname = NewStringf("PARM%d_%s", largnum, Getattr(p, "name"));
-
-	// Printf(stderr,"%s\n", Getattr(p,"tmap:lin"));
-	String *ffitype = compose_foreign_type(n, argtype, Getattr(p,"name"));
-	String *deref_ffitype = dereference_ffitype(ffitype);
-	String *lisptype = get_lisp_type(n, parmtype, Getattr(p, "name"));
-
-#ifdef ALLEGROCL_DEBUG
-	Printf(stderr, "lisptype of '%s' '%s' = '%s'\n", parmtype,
-	       Getattr(p, "name"), lisptype);
-#endif
-
-	// while we're walking the parameters, generating LIN
-	// wrapper code...
-	Setattr(p, "lname", NewStringf("SWIG_arg%d", largnum));
-
-	String *parm_code = Getattr(p, "tmap:lin");
-	if (parm_code) {
-	  String *lname = Getattr(p, "lname");
-
-	  Printf(largs, " %s", lname);
-	  Replaceall(parm_code, "$in_fftype", ffitype); // must come before $in
-	  Replaceall(parm_code, "$in", argname);
-	  Replaceall(parm_code, "$out", lname);
-	  Replaceall(parm_code, "$*in_fftype", deref_ffitype);
-	  Replaceall(wrap->code, "$body", parm_code);
-	}
-
-	String *dispatchtype = Getattr(n, "sym:overloaded") ? dispatching_type(n, p) : NewString("");
-
-	// if this parameter has been removed from the C/++ wrapper
-	// it shouldn't be in the lisp wrapper either.
-	if (!checkAttribute(p, "tmap:in:numinputs", "0")) {
-	  Printf(fcl, "(%s %s %s %s %s)",
-		 // parms in the ff wrapper, but not in the lisp wrapper.
-		 (checkAttribute(p, "tmap:lin:numinputs", "0") ? ":p-" : ":p+"), argname, dispatchtype, ffitype, lisptype);
-
-	  first = 0;
-	}
-
-	Delete(argname);
-	Delete(ffitype);
-	Delete(deref_ffitype);
-	Delete(lisptype);
-      }
-    }
-
-    Printf(wrap->locals, "%s", largs);
-  }
-
-  String *lout = Getattr(n, "tmap:lout");
-  Replaceall(lout, "$owner", GetFlag(n, "feature:new") ? "t" : "nil");
-
-  Replaceall(wrap->code, "$body", lout);
-  // $lclass handling.
-  String *lclass = (String *) 0;
-  SwigType *parsed = Swig_cparse_type(Getattr(n, "tmap:ctype"));
-  //  SwigType *cl_t = SwigType_typedef_resolve_all(parsed);
-  SwigType *cl_t = class_from_class_or_class_ref(parsed);
-  String *out_ffitype = compose_foreign_type(n, parsed);
-  String *deref_out_ffitype;
-  String *out_temp = Copy(parsed);
-
-  if (SwigType_ispointer(out_temp)) {
-    SwigType_pop(out_temp);
-    deref_out_ffitype = compose_foreign_type(n, out_temp);
-  } else {
-    deref_out_ffitype = Copy(out_ffitype);
-  }
-
-  Delete(out_temp);
-
-  Delete(parsed);
-
-  if (cl_t) {
-    lclass = lookup_defined_foreign_ltype(cl_t);
-  }
-
-  int ff_foreign_ptr = 0;
-  if (!lclass) {
-    ff_foreign_ptr = 1;
-    lclass = NewStringf("ff:foreign-pointer");
-  }
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "for output wrapping %s: type=%s, ctype=%s\n", Getattr(n, "name"),
-	 Getattr(n, "type"), Swig_cparse_type(Getattr(n, "tmap:ctype")));
-#endif
-
-  if (lclass)
-    Replaceall(wrap->code, "$lclass", lclass);
-  if (out_ffitype)
-    Replaceall(wrap->code, "$out_fftype", out_ffitype);
-  if (deref_out_ffitype)
-    Replaceall(wrap->code, "$*out_fftype", deref_out_ffitype);
-
-  Replaceall(wrap->code, "$body", NewStringf("(swig-ff-call%s)", wrap->locals));
-  String *ldestructor = Copy(lclass);
-  if (ff_foreign_ptr)
-    Replaceall(ldestructor, ldestructor, "cl::identity");
-  else
-    Replaceall(ldestructor, ":type :class", ":type :destructor");
-  Replaceall(wrap->code, "$ldestructor", ldestructor);
-  Delete(ldestructor);
-
-  Printf(fcl, ")\n");		/* finish arg list */
-
-  /////////////////////////////////////////////////////
-  // Lisp foreign call return type and optimizations //
-  /////////////////////////////////////////////////////
-  Printf(fcl, "  (:returning (%s %s)", compose_foreign_type(n, result_type), get_lisp_type(n, Getattr(n, "type"), Swig_cresult_name()));
-
-  for (Iterator option = First(n); option.item; option = Next(option)) {
-    if (Strncmp("feature:ffargs:", option.key, 15))
-      continue;
-    String *option_val = option.item;
-    String *option_name = NewString(Char(option.key) + 14);
-    Replaceall(option_name, "_", "-");
-
-    // TODO: varargs vs call-direct ?
-    Printf(fcl, "\n   %s %s", option_name, option_val);
-
-    Delete(option_name);
-  }
-
-  Printf(fcl, ")\n  %s)\n\n", wrap->code);
-  // Wrapper_print(wrap, stderr);
-
-  Delete(result_type);
-  Delete(mangled_name);
-  Delete(pl);
-  DelWrapper(wrap);
-
-#ifdef ALLEGROCL_WRAP_DEBUG
-  Printf(stderr, "emit_defun: EXIT\n");
-#endif
-
-  return SWIG_OK;
-}
-
-int ALLEGROCL::functionWrapper(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-	Printf(stderr, "functionWrapper %s\n", Getattr(n,"name"));
-#endif
-
-
-  ParmList *parms = CopyParmList(Getattr(n, "parms"));
-  Wrapper *f = NewWrapper();
-  SwigType *t = Getattr(n, "type");
-  String *name = Getattr(n, "name");
-
-  String *raw_return_type = Swig_typemap_lookup("ctype", n, "", 0);
-  SwigType *return_type = Swig_cparse_type(raw_return_type);
-  SwigType *resolved = SwigType_typedef_resolve_all(return_type);
-  int is_void_return = (Cmp(resolved, "void") == 0);
-
-  Delete(resolved);
-
-  if (!is_void_return) {
-     String *lresult_init =
-	     NewStringf("= (%s)0",
-			SwigType_str(SwigType_strip_qualifiers(return_type),0));
-     Wrapper_add_localv(f, "lresult",
-			SwigType_lstr(SwigType_ltype(return_type), "lresult"),
-			lresult_init, NIL);
-     Delete(lresult_init);
-  }
-  // Emit all of the local variables for holding arguments.
-  emit_parameter_variables(parms, f);
-
-  // Attach the standard typemaps 
-  Swig_typemap_attach_parms("ctype", parms, f);
-  Swig_typemap_attach_parms("lin", parms, f);
-  emit_attach_parmmaps(parms, f);
-
-  String *mangled = mangle_name(n);
-  Node *overloaded = Getattr(n, "sym:overloaded");
-
-  // Parameter overloading
-  Setattr(n, "wrap:parms", parms);
-  Setattr(n, "wrap:name", mangled);
-
-  if (overloaded) {
-    // emit warnings when overloading is impossible on the lisp side.
-    // basically Swig_overload_check(n), but with script_lang_wrapping
-    // set to true.
-    Delete(Swig_overload_rank(n, true));
-    if (Getattr(n, "overload:ignore")) {
-      // if we're the last overload, make sure to force the emit
-      // of the rest of the overloads before we leave.
-      // Printf(stderr, "ignored overload %s(%p)\n", name, Getattr(n, "sym:nextSibling"));
-      if (!Getattr(n, "sym:nextSibling")) {
-	update_package_if_needed(n);
-	emit_buffered_defuns(n);
-	emit_dispatch_defun(n);
-      }
-      DelWrapper(f);
-      return SWIG_OK;
-    }
-  }
-  // Get number of required and total arguments 
-  int num_arguments = emit_num_arguments(parms);
-  int gencomma = 0;
-
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "Walking parameters for %s '%s'\n", Getattr(n, "allegrocl:kind"), name);
-#endif
-  // Now walk the function parameter list and generate code to get arguments
-  String *name_and_parms = NewStringf("%s (", mangled);
-  int i;
-  Parm *p;
-  for (i = 0, p = parms; i < num_arguments; i++) {
-
-#ifdef ALLEGROCL_DEBUG
-	  String *temp1 = Getattr(p,"tmap:in");
-	  String *temp2 = Getattr(p,"tmap:in:numinputs");
-	  Printf(stderr,"  parm %d: %s, tmap:in='%s', tmap:in:numinputs='%s'\n", i, Getattr(p,"name"), temp1 ? temp1 : "", temp2 ? temp2 : "");
-#endif
-
-    while (p && checkAttribute(p, "tmap:in:numinputs", "0")) {
-      p = Getattr(p, "tmap:in:next");
-    }
-
-    if (!p)
-      break;
-
-    SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype"));
-    String *arg = NewStringf("l%s", Getattr(p, "lname"));
-
-    // Emit parameter declaration
-    if (gencomma)
-      Printf(name_and_parms, ", ");
-    String *parm_decl = SwigType_str(c_parm_type, arg);
-    Printf(name_and_parms, "%s", parm_decl);
-#ifdef ALLEGROCL_DEBUG
-    Printf(stderr, "  param: %s\n", parm_decl);
-#endif
-    Delete(parm_decl);
-    gencomma = 1;
-
-    // Emit parameter conversion code
-    String *parm_code = Getattr(p, "tmap:in");
-    //if (!parm_code) {
-    //  Swig_warning(...);
-    //  p = nextSibling(p);
-    /*} else */  {
-      // canThrow(n, "in", p);
-      Replaceall(parm_code, "$input", arg);
-      Setattr(p, "emit:input", arg);
-      Printf(f->code, "%s\n", parm_code);
-      p = Getattr(p, "tmap:in:next");
-    }
-
-    Delete(arg);
-  }
-  Printf(name_and_parms, ")");
-
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "   arity = %d(%d)\n", emit_num_lin_arguments(parms), emit_num_lin_arguments(Getattr(n,"wrap:parms")));
-#endif
-
-  // Emit the function definition
-  String *signature = SwigType_str(return_type, name_and_parms);
-  Printf(f->def, "EXPORT %s {", signature);
-  if (CPlusPlus)
-    Printf(f->code, "  try {\n");
-
-  String *actioncode = emit_action(n);
-
-  String *tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode);
-  if (!is_void_return) {
-    if (tm) { 
-      Replaceall(tm, "$result", "lresult");
-      Printf(f->code, "%s\n", tm);
-      Printf(f->code, "    return lresult;\n");
-      Delete(tm);
-    } else {
-      Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number,
-		   "Unable to use return type %s in function %s.\n",
-		   SwigType_str(t, 0), name);
-    }
-  }
-
-  /* See if there is any return cleanup code */
-  if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) {
-    Printf(f->code, "%s\n", tm);
-    Delete(tm);
-  }
-
-  emit_return_variable(n, t, f);
-
-  if (CPlusPlus) {
-    Printf(f->code, "  } catch (...) {\n");
-    if (!is_void_return)
-      Printf(f->code, "    return (%s)0;\n",
-	     SwigType_str(SwigType_strip_qualifiers(return_type),0));
-    Printf(f->code, "  }\n");
-  }
-  Printf(f->code, "}\n");
-
-  /* print this when in C mode? make this a command-line arg? */
-  if (Generate_Wrapper)
-    Wrapper_print(f, f_cxx_wrapper);
-
-  String *f_buffer = NewString("");
-
-  emit_defun(n, f_buffer);
-  Setattr(n, "allegrocl:lisp-wrap", f_buffer);
-
-  if (!overloaded || !Getattr(n, "sym:nextSibling")) {
-    update_package_if_needed(n);
-    emit_buffered_defuns(n);
-    // this is the last overload.
-    if (overloaded) {
-      emit_dispatch_defun(n);
-    }
-  }
-
-  DelWrapper(f);
-
-  return SWIG_OK;
-}
-
-int ALLEGROCL::namespaceDeclaration(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "namespaceDecl: '%s'(%p) (fc=%p)\n", Getattr(n, "sym:name"), n, firstChild(n));
-#endif
-
-  /* don't wrap a namespace with no contents. package bloat.
-     also, test-suite/namespace_class.i claims an unnamed namespace
-     is 'private' and should not be wrapped. Complying...
-  */
-  if (Getattr(n,"unnamed") || !firstChild(n))
-    return SWIG_OK;
-
-  String *name = Getattr(n, "sym:name");
-
-  String *old_namespace = current_namespace;
-  if (Cmp(current_namespace, "") == 0)
-    current_namespace = NewStringf("%s", name);
-  else
-    current_namespace = NewStringf("%s::%s", current_namespace, name);
-
-  if (!GetInt(defined_namespace_packages, current_namespace)) {
-    SetInt(defined_namespace_packages, current_namespace, 1);
-    String *lispy_namespace = listify_namespace(current_namespace);
-    Printf(f_clhead, "(swig-defpackage %s)\n", lispy_namespace);
-    Delete(lispy_namespace);
-  }
-
-  emit_children(n);
-
-  Delete(current_namespace);
-  current_namespace = old_namespace;
-  return SWIG_OK;
-}
-
-int ALLEGROCL::constructorHandler(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "constructorHandler %s\n", Getattr(n, "name"));
-#endif
-  // Swig_print_node(n);
-  Setattr(n, "allegrocl:kind", "constructor");
-  Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name"));
-
-  // Let SWIG generate a global forwarding function.
-  return Language::constructorHandler(n);
-}
-
-int ALLEGROCL::destructorHandler(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "destructorHandler %s\n", Getattr(n, "name"));
-#endif
-
-  Setattr(n, "allegrocl:kind", "destructor");
-  Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name"));
-
-  // Let SWIG generate a global forwarding function.
-  return Language::destructorHandler(n);
-}
-
-int ALLEGROCL::constantWrapper(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "constantWrapper %s\n", Getattr(n, "name"));
-#endif
-
-  if (Generate_Wrapper) {
-    // Setattr(n,"wrap:name",mangle_name(n, "ACLPP"));
-    String *const_type = Getattr(n, "type");
-
-    String *const_val = 0;
-    String *raw_const = Getattr(n, "value");
-
-    if (SwigType_type(const_type) == T_STRING) {
-      const_val = NewStringf("\"%s\"", raw_const);
-    } else if (SwigType_type(const_type) == T_CHAR) {
-      const_val = NewStringf("'%s'", raw_const);
-    } else {
-      const_val = Copy(raw_const);
-    }
-
-    SwigType_add_qualifier(const_type, "const");
-
-    String *ppcname = NewStringf("ACLppc_%s", Getattr(n, "sym:name"));
-    // Printf(f_runtime, "static const %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val);
-    Printf(f_runtime, "static %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val);
-
-    Setattr(n, "name", ppcname);
-    SetFlag(n, "feature:immutable");
-
-    Delete(const_val);
-    return variableWrapper(n);
-  }
-
-  String *type = Getattr(n, "type");
-  String *value = Getattr(n, "value");
-  String *converted_value = convert_literal(value, type);
-  String *name = Getattr(n, "sym:name");
-
-  Setattr(n, "allegrocl:kind", "constant");
-  Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name"));
-
-#if 0
-  Printf(stdout, "constant %s is of type %s. value: %s\n", name, type, converted_value);
-#endif
-
-  if (converted_value) {
-    Printf(f_clwrap, "(swig-defconstant \"%s\" %s)\n", name, converted_value);
-  } else {
-    Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse constant value '%s'. Setting to NIL\n", value);
-    Printf(f_clwrap, "(swig-defconstant \"%s\" nil #| %s |#)\n", name, value);
-  }
-
-  Delete(converted_value);
-
-  return SWIG_OK;
-}
-
-int ALLEGROCL::globalvariableHandler(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "globalvariableHandler %s\n", Getattr(n, "name"));
-#endif
-
-  if (Generate_Wrapper)
-    return Language::globalvariableHandler(n);
-
-  // String *name = Getattr(n, "name");
-  SwigType *type = Getattr(n, "type");
-  SwigType *rtype = SwigType_typedef_resolve_all(type);
-
-  if (SwigType_isclass(rtype)) {
-    SwigType_add_pointer(type);
-    SwigType_add_pointer(rtype);
-  }
-
-  Printf(f_clwrap, "(swig-defvar \"%s\" \"%s\" :type %s)\n",
-	 Getattr(n, "sym:name"), Getattr(n, "sym:name"), ((SwigType_isconst(type)) ? ":constant" : ":variable"));
-
-  return SWIG_OK;
-}
-
-int ALLEGROCL::variableWrapper(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "variableWrapper %s\n", Getattr(n, "name"));
-#endif
-  Setattr(n, "allegrocl:kind", "variable");
-  Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name"));
-
-  // Let SWIG generate a get/set function pair.
-  if (Generate_Wrapper)
-    return Language::variableWrapper(n);
-
-  String *name = Getattr(n, "name");
-  SwigType *type = Getattr(n, "type");
-  SwigType *ctype;
-  SwigType *rtype = SwigType_typedef_resolve_all(type);
-
-  String *mangled_name = mangle_name(n);
-
-  int pointer_added = 0;
-
-  if (SwigType_isclass(rtype)) {
-    SwigType_add_pointer(type);
-    SwigType_add_pointer(rtype);
-    pointer_added = 1;
-  }
-
-  ctype = SwigType_str(type, 0);
-
-  // EXPORT <SwigType_str> <mangled_name>;
-  // <SwigType_str> <mangled_name> = <name>;
-  Printf(f_runtime, "EXPORT %s %s;\n%s %s = %s%s;\n", ctype, mangled_name, ctype, mangled_name, (pointer_added ? "&" : ""), name);
-
-  Printf(f_cl, "(swig-defvar \"%s\" :type %s)\n", mangled_name, ((SwigType_isconst(type)) ? ":constant" : ":variable"));
-
-  Printf(stderr,"***\n");
-  Delete(mangled_name);
-
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "DONE variable %s\n", Getattr(n, "name"));
-#endif
-
-  return SWIG_OK;
-}
-
-int ALLEGROCL::memberfunctionHandler(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "memberfunctionHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name"));
-  Swig_print_node(n);
-#endif
-  Setattr(n, "allegrocl:kind", "member function");
-  Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name"));
-
-  // Let SWIG generate a global forwarding function.
-  return Language::memberfunctionHandler(n);
-}
-
-int ALLEGROCL::membervariableHandler(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "membervariableHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name"));
-#endif
-  Setattr(n, "allegrocl:kind", "member variable");
-  Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name"));
-
-  // Let SWIG generate a get/set function pair.
-  return Language::membervariableHandler(n);
-}
-
-int ALLEGROCL::typedefHandler(Node *n) {
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "In typedefHandler\n");
-#endif
-
-  SwigType *typedef_type = Getattr(n,"type");
-  // has the side-effect of noting any implicit
-  // template instantiations in type.
-  String *ff_type = compose_foreign_type(n, typedef_type);
-
-  String *sym_name = Getattr(n, "sym:name");
-
-  String *name;
-  String *type_ref;
-
-  if (in_class) {
-#ifdef ALLEGROCL_TYPE_DEBUG
-    Printf(stderr, "  typedef in class '%s'(%p)\n", Getattr(in_class, "sym:name"), in_class);
-#endif
-    Setattr(n, "allegrocl:typedef:in-class", in_class);
-
-    String *class_name = Getattr(in_class, "name");
-    name = NewStringf("%s__%s", class_name, sym_name);
-    type_ref = NewStringf("%s::%s", class_name, sym_name);
-    Setattr(n, "allegrocl:in-class", in_class);
-  } else {
-    name = Copy(sym_name);
-    type_ref = Copy(Getattr(n, "name"));
-  }
-
-  Setattr(n, "allegrocl:namespace", current_namespace);
-
-  String *lookup = lookup_defined_foreign_type(typedef_type);
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "** lookup='%s'(%p), typedef_type='%s', strcmp = '%d' strstr = '%d'\n", lookup, lookup, typedef_type, Strcmp(typedef_type,"void"), Strstr(ff_type,"__SWIGACL_FwdReference"));
-#endif
-
-  if(lookup || (!lookup && Strcmp(typedef_type,"void")) ||
-     (!lookup && Strstr(ff_type,"__SWIGACL_FwdReference"))) {
-	  add_defined_foreign_type(n, 0, type_ref, name);
-  } else {
-     add_forward_referenced_type(n);
-  }
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "Out typedefHandler\n");
-#endif
-
-  Delete(ff_type);
-
-  return SWIG_OK;
-}
-
-// forward referenced classes are added specially to defined_foreign_types
-int ALLEGROCL::classforwardDeclaration(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "classforwardDeclaration %s\n", Getattr(n, "name"));
-#endif
-
-  add_forward_referenced_type(n);
-  return SWIG_OK;
-}
-
-int ALLEGROCL::classHandler(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "classHandler %s::%s\n", current_namespace, Getattr(n, "sym:name"));
-#endif
-
-  int result;
-
-  if (Generate_Wrapper)
-    result = cppClassHandler(n);
-  else
-    result = cClassHandler(n);
-
-  return result;
-}
-
-int ALLEGROCL::cClassHandler(Node *n) {
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "In cClassHandler\n");
-#endif
-  /* Add this structure to the known lisp types */
-  // Printf(stderr, "Adding %s foreign type\n", name);
-  String *ns = listify_namespace(current_namespace);
-
-  add_defined_foreign_type(n);
-
-  Delete(ns);
-
-#ifdef ALLEGROCL_TYPE_DEBUG
-  Printf(stderr, "Out cClassHandler\n");
-#endif
-
-  return SWIG_OK;
-}
-
-int ALLEGROCL::cppClassHandler(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "cppClassHandler %s\n", Getattr(n, "name"));
-#endif
-
-  // String *name=Getattr(n, "sym:name");
-  // String *kind = Getattr(n,"kind");
-
-  /* Template instantiation.
-     Careful. 
-     SWIG does not create instantiations of templated classes whenever
-     it sees a templated class reference (say, as a return type, or
-     in a parameter list).
-
-     The %template directive results in a templated class instantiation
-     that will actually be seen by <LANG> :: classHandler().
-
-     In this case, we don't want to error if the type already exists;
-     the point is to force the creation of wrappers for the templated
-     class.
-   */
-  String *templated = Getattr(n, "template");
-  String *t_name;
-  // String *ns = listify_namespace(current_namespace);
-
-  if (templated) {
-    t_name = namespaced_name(n);
-  } else {
-    t_name = Getattr(n, "name");
-  }
-
-  Setattr(n, "allegrocl:namespace", current_namespace);
-
-  /* Add this structure to the known lisp types.
-     Class may contain references to the type currently being
-     defined */
-  if (!templated || !lookup_defined_foreign_type(t_name)) {
-#ifdef ALLEGROCL_CLASS_DEBUG
-    Printf(stderr, "Adding %s foreign type\n", Getattr(n, "sym:name"));
-#endif
-    add_defined_foreign_type(n);
-  } else {
-#ifdef ALLEGROCL_CLASS_DEBUG
-    Printf(stderr, "cppClassHand: type %s already exists. Assuming %%template instantiation for wrapping purposes.\n", Getattr(n, "sym:name"));
-#endif
-    add_defined_foreign_type(n, 1);
-  }
-
-  // Generate slot accessors, constructor, and destructor.
-  Node *prev_class = in_class;
-  in_class = n;
-
-  Node *c;
-  // walk all member variables.
-#ifdef ALLEGROCL_CLASS_DEBUG
-  Printf(stderr, "   MANUALLY walking class members... \n");
-#endif
-  for (c = firstChild(n); c; c = nextSibling(c)) {
-    // ping the types of all children--even protected and private
-    // so their types can be added to the linked_type_list.
-    SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"),
-				     Getattr(c, "type"));
-#ifdef ALLEGROCL_CLASS_DEBUG
-    Printf(stderr, "looking at child '%p' of type '%s' '%d'\n", c, childType, SwigType_isfunction(childType));
-    // Swig_print_node(c);
-#endif
-    if (!SwigType_isfunction(childType))
-      Delete(compose_foreign_type(n, childType));
-
-    Delete(childType);
-  }
-#ifdef ALLEGROCL_CLASS_DEBUG
-  Printf(stderr, "   MANUAL walk DONE.\n");
-#endif
-
-  // this will walk all necessary methods.
-#ifdef ALLEGROCL_CLASS_DEBUG
-  Printf(stderr, "   LANGUAGE walk of children...\n");
-#endif
-  Language::classHandler(n);
-#ifdef ALLEGROCL_CLASS_DEBUG
-  Printf(stderr, "   LANGUAGE walk DONE\n");
-#endif
-  in_class = prev_class;
-
-  return SWIG_OK;
-}
-
-int ALLEGROCL::emit_one(Node *n) {
-  // When the current package does not correspond with the current
-  // namespace we need to generate an IN-PACKAGE form, unless the
-  // current node is another namespace node.
-  if (Cmp(nodeType(n), "namespace") != 0 && Cmp(current_package, current_namespace) != 0) {
-    String *lispy_namespace = listify_namespace(current_namespace);
-    Printf(f_clwrap, "(swig-in-package %s)\n", lispy_namespace);
-    Delete(lispy_namespace);
-    Delete(current_package);
-    current_package = NewStringf("%s", current_namespace);
-  }
-
-  Setattr(n, "allegrocl:package", current_package);
-
-  return Language::emit_one(n);
-}
-
-int ALLEGROCL::enumDeclaration(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "enumDeclaration %s\n", Getattr(n, "name"));
-#endif
-
-  if (getCurrentClass() && (cplus_mode != PUBLIC))
-    return SWIG_NOWRAP;
-
-  if (Getattr(n, "sym:name")) {
-    add_defined_foreign_type(n);
-  }
-  Node *c;
-  for (c = firstChild(n); c; c = nextSibling(c)) {
-    ALLEGROCL::enumvalueDeclaration(c);
-    // since we walk our own children, we need to add
-    // the current package ourselves.
-    Setattr(c, "allegrocl:package", current_package);
-  }
-  return SWIG_OK;
-}
-
-
-int ALLEGROCL::enumvalueDeclaration(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "enumvalueDeclaration %s\n", Getattr(n, "name"));
-#endif
-  /* print this when in C mode? make this a command-line arg? */
-  if (Generate_Wrapper) {
-	  SwigType *enum_type = Copy(Getattr(n,"type"));
-	  String *mangled_name =
-		  mangle_name(n, "ACL_ENUM",
-			      in_class ? Getattr(in_class,"name") :
-			      current_namespace);
-	  
-	  SwigType_add_qualifier(enum_type,"const");
-
-	  String *enum_decl = SwigType_str(enum_type, mangled_name);
-	  Printf(f_cxx_wrapper, "EXPORT %s;\n", enum_decl);
-	  Printf(f_cxx_wrapper, "%s = %s;\n", enum_decl, Getattr(n, "value"));
-
-    Delete(mangled_name);
-    Delete(enum_type);
-    Delete(enum_decl);
-  }
-  return SWIG_OK;
-}
-
-int ALLEGROCL::templateDeclaration(Node *n) {
-#ifdef ALLEGROCL_DEBUG
-  Printf(stderr, "templateDeclaration %s\n", Getattr(n, "name"));
-#endif
-
-  String *type = Getattr(n, "templatetype");
-
-  // Printf(stderr, "tempDecl: %s %s\n", Getattr(n,"name"),
-  //        type);
-  // Swig_print_node(n);
-
-  if (!Strcmp(type, "cdecl")) {
-    SwigType *ty = NewStringf("%s%s", Getattr(n, "decl"),
-			      Getattr(n, "type"));
-    Delete(ty);
-  }
-
-  Delete(type);
-
-  return SWIG_OK;
-}
-
