Release Notes for Allegro CL 5.0.1

$Revision: 5.0.2.31 $

Most of this document describes new features and changed features in Allegro CL 5.0.1 compared to 5.0 and 5.0.1/5.0 compared to earlier releases, release 4.3 and 4.3.1 on Unix platforms and release 3.0.x and 4.3.2 (a version with limited distribution) on Windows. Most of the information is, therefore, not of direct importance to new users of ACL 5.0.1.

The documentation has been entirely redone. All Allegro CL documentation is online. Start with introduction.htm which provides a documentation map. See 6.0 Common Graphics and Integrated Development Environment documentation in that document for an introduction to Common Graphics and Integrated Development Environment documentation, which is not integrated with the Allegro CL documentation.

The document index.htm is an index to the Allegro CL documentation.

A printed Read This First document is included with the release. This document is prepared after the distribution cd's are manufactured and may contain important information which is not in this document.

For installation information, please see <Allegro directory>/readme.htm.

The sections of this document are as follows. The sections dealing with the change from 3.0.x or 4.x to 5.0 are labeled (4.x-5.0) or (3.0.x-5.0) or (3/4.x-5.0). These sections have nothing new for users moving from 5.0 to 5.0.1. All unlabeled sections have information for users moving from 5.0 to 5.0.1 (although some information may also be relevant to users moving to 5.0.1 from 4.x or 3.0.x).

Allegro CL 5.0.1 compared to 5.0

AllegroStore 1.3 (All users porting from AllegroStore 1.2 read this section!)
CLIM on Allegro CL 5.0.1
Allegro OBDC: a new version for 5.0.1
Socket changes in 5.0.1
Emacs-Lisp interface changes in 5.0.1
OLE changes in 5.0.1
Miscellaneous Common Lisp changes
Changes to Allegro Common Windows (this does not affect most customers)
Changes to the Integrated Development Environment on Windows (section only refers to cgide.hlp file)

Platform-specific information (new in 5.0.1)
The executable and image files are different (4.x-5.0)
The Home Location/Allegro directory (4.x-5.0)
Running Allegro CL 5.0.1
Top-Level Initialization (3/4.x-5.0)
The Integrated Development Environment (IDE) [Windows only] (3.0.x-5.0)
Allegro Composer [UNIX only]
Information Specific to Users of International Allegro CL (Contains new information for 5.0.1)
Profiler (3/4.x-5.0)
About the Lisp Heap (3/4.x-5.0)
Changes to malloc and free (3/4.x-5.0)
build.exe vs. lisp.exe (Windows only) (3.0.x-5.0)
lisp.exe (Windows only) (3.0.x-5.0)
New Command Line Options (3/4.x-5.0)
Building Custom Lisp Images (3/4.x-5.0)
Pathnames on Windows (3/4.x-5.0)
Some Windows-Specific information (3.0.x-5.0)
Differences Between Unix and Windows Versions of Allegro CL (3/4.x-5.0)
Differences When Running on Windows 95/98 and NT (3.0.x-5.0)
User Control of Application Termination (Windows only) (3.0.x-5.0)
Pathnames and File Changes (3/4.x-5.0)
Merging Directory Components via merge-pathnames (3/4.x-5.0)
The Compiler (3/4.x-5.0)
Removed Symbols (3/4.x-5.0)
Conditionalizing Lisp Code
defsystem (3/4.x-5.0)
New disassemble functionality (3/4.x-5.0)
top-level stream variables (3/4.x-5.0)
:local Debugger Command (3/4.x-5.0)
excl:dumplisp (3/4.x-5.0)
The Emacs-Lisp Interface (3/4.x-5.0)
The Foreign Function Interface (3/4.x-5.0)
Foreign File Processing (3/4.x-5.0)
Changes in the Semantics of cl:load (3/4.x-5.0)
Search List Changes (3/4.x-5.0)
excl:run-shell-command (3/4.x-5.0)
The inspector
Garbage Collection (3/4.x-5.0)
Hash Tables (3/4.x-5.0)
New make-array functionality (3/4.x-5.0)
Packages (3/4.x-5.0)
Porting Applications to Allegro CL 5.0.1
Pure Lisp Libraries (formerly .lso files) (3/4.x-5.0)
Specialized Array Types (3/4.x-5.0)
The time macro (3/4.x-5.0)
Consecutive Errors (3/4.x-5.0)
Handling Printer Errors (3/4.x-5.0)
Miscellaneous (3/4.x-5.0)


Allegro CL 5.0.1 compared to 5.0

Beyond bug fixes and patch integration, the base Lisp in Allegro CL 5.0.1 compared to 5.0 is not much changed. The changes in this release are mostly in add-on products: there is a completely new version of Allegro ODBC; there are significant enhancements to Common Graphics and the Integrated Development Environment (Windows only); and there are new versions of AllegroStore (the version with release 5.0.1 is 1.3; version 1.2 ran with release 5.0) and CLIM.

Note on compatibility of fasl files between 5.0 and 5.0.1 for Windows and Linux on Intel x86 platforms: in the Intel x86 versions of Allegro CL 5.0, there was a problem passing many arguments either to apply, or to a function with a stack-consed &rest argument. The bug manifests itself as a Segmentation violation during the call to the stack-resitfied function.The fix for this implemented in 5.0.1.beta2 (and in 5.0.1) causes a different compilation, and is preferred over the 5.0 compilation of dynamic-extent &rest arguments. A fasl file compiled by 5.0 will be compatible with 5.0.1, but, as in 5.0, it does not guard against large numbers of arguments being passed. Therefore, we recomend that if you have any dynamic-extent &rest arguments, you recompile your code for 5.0.1 on your x86 versions of Allegro CL. (Note that a bug in 5.0.1.beta2 compilation, fixed in 5.0.1, resulted in a all-platform fasl incompatibility between 5.0/5.0.1.beta1 and 5.0.1.beta2 but that incompatibility is not present in 5.0.1.)

Other changes are detailed in the following sections:

     AllegroStore 1.3 (All users porting from AllegroStore 1.2 read this section!)
     CLIM on Allegro CL 5.0.1
     Allegro OBDC: a new version for 5.0.1
     Socket changes in 5.0.1
     Emacs-Lisp interface changes in 5.0.1
     OLE changes in 5.0.1
     Miscellaneous Common Lisp changes
     Known problems in 5.0.1
     Changes to Allegro Common Windows (this does not affect most customers)
     Changes to the Integrated Development Environment on Windows (section only refers to cgide.hlp file)


AllegroStore 1.3 on ACL 5.0.1 (All users porting from AllegroStore 1.2 read this section!)

The version of AllegroStore with Allegro CL 5.0.1 is 1.3. (The version with ACL 5.0 was 1.2.)

There is a new printed AllegroStore 1.3 manual.

Important Notes

AllegroStore 1.3 database file format is not compatible with earlier AllegroStore version database files. If you wish to use databases created with earlier AllegroStore versions, you must convert them by:

Before installing AllegroStore 1.3, dump the databases using the asdump module for the AllegroStore version that created the database.

Install AllegroStore 1.3.

Restore the dumped databases using the AllegroStore 1.3 asrestore module.

You must run AllegroStore 1.3 with the ObjectStore version included on your installation CD. You can use the ObjectStore osversion utility to see your current version. The bulleted list just below shows the platform specific ObjectStore versions included on the ACL 5.0.1 installation CD.

Besides bug fixes, AllegroStore 1.3 includes:


CLIM on Allegro CL 5.0.1

The printed CLIM  Release Notes have been changed for release 5.0.1. Also note that:

  1. Double-click events are now explicitly recognized and processed. There are no predefined gestures for this event, but you can define gestures like this:
(define-gesture-name :OPEN :pointer-button (:left :double))

You can then use such a gesture in define-presentation-to-command-translator. On Windows, the double-click time is set by the operating system in the Mouse control panel. On UNIX, the double-click time is set by the internal variable tk-silica::*double-click-time*. Note that CLIM will generate a single-click event immediately before a double-click event. At the gesture level, this is equivalent to a :SELECT event followed immediately by an :OPEN event.

  1. The NEW-PAGE function now works for generating a page break to a postscript stream.
  2. CLIM now works on Linux/Intel platforms and, but much less well, on MkLinux/PowerPC or LinuxPPC/PowerPC platforms because it does not work well with LessTif.
  3. CLIM works on FreeBSD/Intel platforms, but only with Metrolink Motif Complete! version 1.2.4.
  4. On UNIX, the function notify-user now takes a keyword argument :warp-mouse that causes the pointer to be moved to the dialog box in the case that the input focus policy is :sheet-under-pointer.
  5. On Windows, the function notify-user can take the following as the value of :exit-boxes. Arbitrary exit box labels are not supported because of restrictions to the system function MessageBox().
'("OK") or win:mb_ok
'("OK" "CANCEL") win:mb_okcancel
'("Yes" "No") win:mb_yesno
'("Retry" "Cancel") win:mb_retrycancel
'("Yes" "No" "Cancel") win:mb_yesnocancel
'("Abort" "Retry" "Ignore") win:mb_abortretryignore

If you need something else, define your own application frame.

  1. On Windows, the function select-file can take the following undocumented keyword arguments:

:dialog-type either :OPEN, :SAVE, or :DIRECTORY
:file-types default is '(("All Files" . "*.*"))
:multiple-select default is NIL
:warn-if-exists-p default is T (applies only to :SAVE)

  1. A large number of bug fixes have been applied to Windows. Highlights:

Allegro OBDC: a new version for 5.0.1

Allegro ODBC v2 (AODBC, v2) is a second generation interface between Allegro and databases using odbc. Applications written with the version 1 interface will not work without source modification in version 2. Version 2 is documented in aodbc_v2.htm. (Version 1 is documented in a printed document. It is supported in Allegro CL 5.0.1 but, as said above, version 1 and version 2 cannot be used together.)

AODBC v2 works on most platforms including International Allegro CL on Windows.

These are the changes in version 2:


Socket changes in 5.0.1

See socket.htm, which has been updated.

New functions socket:shutdown and socket-control.

More control over whether cached values are looked at or not in lookup-hostname and ipaddr-to-hostname.

New bivalent (either text or binary data can be used) in stream sockets (see make-socket). Chunking is supported with bivalent sockets (see socket-control).

The exported symbol socket:set-socket-format names a function for internal use. This function is not documented and is not intended for use. It will likely change significantly and without notice in the 5.0.1 final release.

This information from Miscellaneous CL changes may be of interest to users of the socket facility (the first is abbreviated here):

  1. Backward incompatible: this change makes code from 5.0 (and earlier) behave differently. When a read was done on streams not connected to files Allegro would do a force-output first.
  1. mp:wait-for-input-available function can now be used to test for a connection pending on a passive socket stream.

Emacs-Lisp interface changes in 5.0.1

There are two new variables:

fi:connect-to-windows
fi:common-lisp-subprocess-wait-forever

Both have doc strings and are discussed in ../../eli/readme.htm.


OLE changes in 5.0.1

See ole.htm for a general description of the OLE interface in Allegro CL. Functionality is described in ole_reference.htm. Changes in 5.0.1 compared to 5.0 include:

  1. ole::*version* is 1.0.63.
  2. MP usage: Each lisp process must call ole:start-ole before making any other OLE calls. As has always been the case, a second start-ole call from the same thread is harmless.
  3. MP usage: Any thread that calls ole:start-ole should call ole:stop-ole before exiting.
  4. New exported macros ole:xeno-slot, and ole:xeno-address. Documented in ole_reference.htm.
  5. The following OLE modules can be loaded using ole:require-modules:
                   keyword                                  module
                  :automation-server                Server-side OLE automation via IDispatch
                  :factory-server                       Server-side OLE class factory support
                  :connection-server                 Server-side OLE connection support
                  :ocx-container                        Support for OCX containers
  6. In def-ocx-class, when specifying a set of interfaces to be implemented by the same interface, the first-named class in the set is the one that will be provided, not the last. Example:
(ole:def-ocx-class foo (foo-base :interfaces IDispatch (IViewObject2 IViewObject)) ()) 

This says that when asked for either the IViewObject or the IViewObject2 interface, the object will supply its IViewObject2 interface.

  1. Constant symbols have been added for these OLE constants:
                     OLE:DISPID_BACKCOLOR
                     OLE:DISPID_FORECOLOR
                     OLE:STG_E_CANTSAVE
                     OLE:STG_E_MEDIUMFULL
                     OLE:OLE_S_USEREG
                     OLE:OLEOBJ_E_NOVERBS
                     OLE:PERPROP_E_NOPAGEAVAILABLE
                     OLE:TYPEFLAG_FHIDDEN
                     OLE:TYPEFLAG_FCONTROL
                     OLE:LIBFLAG_FRESTRICTED
                     OLE:LIBFLAG_FHIDDEN
                     OLE:LIBFLAG_FCONTROL
                     OLE:LIBFLAG_FHASDISKIMAGE
                     OLE:DV_E_FORMATETC
                     OLE:DV_E_LINDEX
                     OLE:DV_E_DVASPECT
                     OLE:VIEW_S_ALREADYFROZEN
                     OLE:INPLACE_E_NOTUNDOABLE
                     OLE:E_POINTER
                     OLE:OLEOBJ_S_CANNOT_DOVERB_NOW
  2. set-registry-value: setting a value to NIL is the same as setting it to the empty string "".
  3. New functions ole:add-registry-key and ole:add-registry-structure documented in ole_reference.htm.
  4. Server interface tracing output has been expanded for multi-threaded environment.
  5. external-ole-interface objects, the lisp client interfaces, now use a fixed-index slot to hold the interface address.
  6. ole:auto-getf and (setf ole:auto-getf) now accept non-integral index arguments.
  7. New control variable ole:*server-initialization-complete*, documented in ole_reference.htm.
  8. When specifying :dispid slots for ole:automaton-class classes, the (:dispid xxx) specifier accept a form for xxx; the form will be evaluated when the defclass form is evaluated.
  9. New functions ole:VariantInit, ole:VariantClear, ole:VariantCopy, and ole:VariantChangeType are foreign-function links to these services in the OLE API.
  10. Added tracing features to ConnectionPointContainers.
  11. A released client interface is changed to be an instance of class released-IUnknown. The class released-IUnknown is now a subclass of external-ole-interface.
  12. The ole package now contains shadowing symbols ole:Advise and ole:Unadvise.
  13. Support for IStorage (see ole_reference.htm) classes: IStorage, IStorage-client, IStorage-server
                                                                          constant: IID_IStorage
                                                                          functions: file-is-storage-p, open-ole-storage, open-ole-stream
  14. Support for ITypeLib (see ole_reference.htm) classes: ITypeLib, ITypeLib-client
                                                                           constant: IID_ITypeLib
                                                                           functions: guid-typelib, guid-typeinfo
  15. Support for ITypeInfo (see ole_reference.htm) classes: ITypeInfo, ITypeInfo-client
                                                                            structures: lisp-typeinfo with slots lisp-typeinfo-kind, lisp-typeinfo-interfaces,
                                                                                                                            lisp-typeinfo-interface-flags, lisp-typeinfo-functions
                                                                                            lisp-elemdesc with slots lisp-elemdesc-name, lisp-elemdesc-tdesc,
                                                                                                                              lisp-elemdesc-flow
                                                                                            lisp-funcdesc with slots lisp-funcdesc-name, lisp-funcdesc-elemdescFunc,
                                                                                                                             lisp-funcdesc-params, lisp-funcdesc-invkind
                                                                             constant: IID_ITypeInfo
                                                                             functions: get-type-attr, lisp
  16. Preliminary support for OCX classes (see ole_reference.htm). classes container-mixin, document-mixin, site-mixin,
                                                  control functions: add-site, install-control, site-name, process-site-message
  17. IDispatch-client and IDispatch-server are exported from the OLE package and documented in ole_reference.htm.
  18. Extensions to variant-value handling. Details in ole_reference.htm.

A variant structure is a tagged union used to transmit arbitrary values between server and client using the COM IDispatch interface. We provide functions to store lisp values into and retrieve lisp values from variants.

These are now user-extendable so that the application coder can define new lisp types (structures and classes) and specify how they are to be stored into a variant.

The COM Date type, which used to be extracted as a lisp integer representing the equivalent universal-time, is now extracted as an instance of the ole:lisp-date structure, whose lisp-date-ut component is the universal-time (see 25 below). Storing a lisp-date into a variant sets the variant's type code to indicate a date is being transmitted.

The variant-handling functions now accept a wider range of array types so that arrays of values can be transmitted and received as Invoke parameters and results. More safe-arrays are handled, allowing Visual Basic to pass and receive vectors of values.

variant-value now returns a lisp-date object when the variant is of type VT_DATE. (setf variant-value) will set the variant to be a VT_DATE if the value to store is a lisp-date.

  1. new global symbol variant-value-translation-function and a new generic function set-variant-value-extension (see ole_reference.htm).
  2. new structure lisp-date and associated functions lisp-date-ut and make-lisp-date (see ole_reference.htm)
  3. ole-error now signals one of extended-incoming-error or incoming-error, as appropriate, instead of printing an error message.
  4. registry-value-names and registry-subkey-names are now exported and are documented in ole_reference.htm.
  5. New error condition classes are signaled when ole code recognizes certain errors. Documented in ole_reference.htm. Classes (all exported from ole package) are:

exception-info
execution-error
incoming-error
extended-incoming-error
idispatch-invoke-exception

A new function, signal-server-exception, allows server code implementing IDispatch.Invoke to return exception information to the client.


Miscellaneous Common Lisp changes in 5.0.1

The more complicated changes are listed first.

  1. Backward incompatible: this change makes code from 5.0 (and earlier) behave differently. When a read was done on streams not connected to files Allegro would do a force-output first. This would allow code  with prompts like this
(format t "Enter your name: ")
(read)

to work, even if you forgot to do the force-output yourself.

Some users found cases where this behavior was undesirable. A stream is bidirectional and it is often necessary to control each side of the connection explicitly and independently. As a result we felt that the safest thing to do was to  remove the automatic call to force-output when a read was done.

When porting your code to this version of lisp look in your code for reads from standard input and make sure that if a prompt was printed before the read, that a force-output is done after the prompt is printed. Thus, the code above should be changed to

(format t "Enter your name: ")
(force-output)
(read)
  1. The ANSI-specified fifth positional argument to the ~R format directive and a fourth positional argument to other numeric directives to allow the comma-interval to be specified. This is implemented in 5.0.1. Here are some examples:
USER(1): (format nil "~,,' ,:B" 13)
"1 101"
USER(2): (format nil "~,,' ,4:B" 13)
"1101"
USER(3): (format nil "~,,' ,4:B" 17)
"1 0001"
USER(4): (format nil "~19,'0,' ,4:B" 3333)
"000001101 0000 0101"
USER(5): (format nil "~3,,,' ,2:R" 17)
"1 22"
USER(6): (format nil "~,,'|,2:D" #xFFFF)
"6|55|35"
USER(7): 
  1. The ordering of the lisp and C heaps is important, and is assumed to be correct by the garbage collector in dealing with arrays allocated with :allocation :lispstatic-reclaimable, or by foreign types allocated with allocation :foreign-static-gc. The assumption is that the C heap is above (has greater address than) the lisp heap.

Previously, the ordering of heaps was not enforced, and users were allowed to build images with lisp heaps above C heaps, with potential resulting data loss if the affected data types were used extensively.

In 5.0.1, an attempt to order the heaps incorrectly will result in a build failure. The locations are specified by the :c-heap-start and :lisp-heap-start arguments to build-lisp-image. See building_images.htm.

  1. New variable sys:*temporary-directory*.
  2. New function - excl:symbolic-link-p.
  3. common-lisp:ensure-directories-exist is now more efficient when the directory exists
  4. common-lisp:directory now returns the entries in "directory" order (i.e. the order they are returned by the Operating System).
  5. The handling of the :copy-shared-libraries keyword argument to generate-application was improved when the value is a lambda expression.See delivery.htm.
  6. The file mfc42.dll is no longer needed by Allegro CL.
  7. excl:set-case-mode now converts the case of strings on common-lisp:*modules*.
  8. There is a working example of using Lisp as a shared library on UNIX. Previously there was only an example on Windows.
  9. Allegro Runtime and Dynamic Runtime: when calling a not-in-runtime function, don't die just signal an error. Also, valid modules are checked for at build time as well as run time. (In 5.0, calling a non-runtime function like compile caused the image to exit immediately; and no checking was done at build time to see whether improper modules were included in a runtime image.)
  10. New keyword argument to build-lisp-image :build-executable. This allows build.exe to be used by build-lisp-image on Windows. This argument also affects generate-application.
  11. We found and fixed a rare multiprocessing bug whereby the Lisp system would stall. We do not know if customers have experienced this bug or not.
  12. New :fixnum primitive type allowed to def-foreign-type. See ftype.htm.
  13. mp:wait-for-input-available function can now be used to test for a connection pending on a passive socket stream.
  14. The comp:generate-inline-call-tests-switch now does nothing. (It only dealt with the flavors:send macro and that optimization is now handled differently.)
  15. Inspection of hash tables now shows a nice listing of key/value pairs. (The inspector is documented in inspector.htm but this change is not yet reflected in that document.)
  16. In the default zoom display (i.e., where ":zoom :all nil" is in effect) the multiprocessing package is now hidden. See debugging.htm and the top-level command :hide.
  17. :include-common-graphics argument to build-lisp-image (see building_images.htm) is no longer supported. If you are building a development image, specify :include-ide true (and the IDE and Common Graphics will be included in the image). When building a delivery, use the project system in the IDE. Contact Franz Inc. (bugs@franz.com) if you are having trouble building a Common Graphics application.
  18. Inspecting hashtables now displays data in Key/Value pairs (odd indices are keys, even are values). Navigation commands (:i >, :i <, :i n) work as does :i set n val. The inspector is described in inspector.htm but this change is not yet reflected there.
  19. Windows only: system dll's are copied by generate-application to a subdirectory named system-dlls/. This prevents problems with multiple seen copies of the same dll's on Windows but makes installing of applications necessarily more complicated. See 4.9 Windows specific information in delivery.htm and also the next entry.
  20. An Install Wizard takes a destination-directory created by generate-application and creates a new directory containing all those files and also a setup.exe installation program. See 4.10 Installation of your application on Windows using the Install Wizard  in delivery.htm.
  21. load has a new system-library keyword argument. If specified true when a system library (.so file on most Unix systems, .sl file on HP's, and .dll file on Windows) is loaded, it will not be copied to the destination-directory by generate-application regardless of the value of the copy-shared-libraries argument. See 1.0 Using the load function in loading.htm and the description of the copy-shared-libraries argument to generate-application in delivery.htm.
  22. New +cc command-line argument (Windows only). It causes Allegro CL to ignore any previous command-line arguments starting with +c. (The arguments starting with +c affect the console window. The +cc argument is useful when another argument starting with +c is specified as a resource. See 3.0 Command line arguments in startup.htm and 4.1 Resources in delivery.htm.
  23. ff:string-to-char* and ff:char*-to-string are now obsolete (but they continue to work as before). New code should use string-to-native, string-to-mb, native-to-string, and mb-to-string, all in the excl package. See also excl:with-native-string.
  24. The function excl:lispval-other-to-address has been exported. It is useful when desiring to free static arrays (see 10.4 Static arrays in gc.htm and 5.6 cl:make-array in implementation.htm for information on static arrays).
  25. New ports: Allegro CL now runs on Intel-based machines running FreeBSD 3.x, and on PowerPC's running MkLinux DR3 (Developer release 3) and LinuxPPC R4.
  26. Documentation for the MetaObject Protocol. The files in the doc/cl/mop/ subdirectory are an HTML version of the description of the MetaObject Protocol in chapters 5 and 6 of The Art of MetaObject Protocol by G. Koczales, J. des Rivieres, and D. Brobrow. The HTML version was prepared by Howard Stearns and copyrighted by the Elwood Corporation, as described in mop/admin.html. See mop/contents.html.

Known problems in Allegro CL 5.0.1

  1. Problem with an optimization of cl:apply. Whenever the compiler optimizing consing by disposing of an &rest argument to a function that calls apply (see compiling.htm#10.3 Stack consing, avoiding consing using apply, and stack allocation), then if a call to that function is ever examined on the stack with the lisp debugger, the wrong information is shown on the call. The failure mode of the debugger may include segvs and illegal instructions, in some cases, but usually it just shows the wrong information.

This problem was uncovered in release 5.0 but due to the globality of the complete fix, we were not able to put it into the 5.0.1 version. Instead, the debugger relies on a special mode of disassemble to determine how to interpret the values on the stack.

This means that if you are not running a runtime image, but are looking at stack locations, then you should require the disassembler, with

(require :disasm)

so that such calls will be properly shown. If you are using a runtime, the fix will not work, since the disassembler cannot be used in a runtime image.


Changes to Allegro Common Windows in 5.0.1 (this does not affect most customers)

Allegro Common Windows is an X-based window system supported with earlier releases of Allegro CL. It still exists in the product (to support certain internal things and certain legacy code) though it is no longer officially supported and rarely changed. However, two changes regarding international characters have been added in 5.0.1, as reported here.


Changes to the Integrated Development Environment on Windows in 5.0.1

Windows only. See the Release Notes entry in the Common Graphics/IDE Winhelp file (<Allegro directory>/cg/cgide.hlp) for an extensive discussion of changes in the IDE and Common Graphics from 5.0 to 5.0.1.

To see this entry, start Allegro CL with the IDE, choose Help | Common Graphics Index, and enter Release notes in box 1 of the Index tab in the dialog that appears and click on the Display button.


Platform specific information

This new section has been added to provide information specific to particular platforms. For 5.0.1, it is the HP-specific information that is important. Most other sections have no information at this time.

Sparc-specific information
HP-specific information
DEC-running DEC-UNIX-specific information
DEC-running NT-specific information
SGI-specific information
AIX-specific information
Linux-on-Intel-specific information
Linux-on-PowerPC-specific information
FreeBSD-specific information
Windows-specific information


Sparc-specific information

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.


HP-specific information

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.

There are apparent problems with mmap with both HP/UX 10.20 and 11.x, which prevent Lisp from being able to use as much swap space as it should. These apparent problems should only affect users trying to run very large images (a significant fraction of a Gigabyte). Please contact Franz Inc. for further information if you are having problems running very large images on HP machines. The issues regarding swap space utilization are very complicated. Franz Inc. may refer you to HP support.

HP/UX 10.20 and HP/UX 11.x

There exists a compatibility problem between HP-UX 10.20 and HP-UX 11.x. Of course, the usual downward-incompatibility exists, and binaries built on HP-UX 11.x systems will simply not run on HP-UX 10.20, as is expected. But more subtle compatibility problems exist when creating binaries on HP-UX 10.20 and expecting them to work on HP-UX 11.x. Indeed, much functionality does work, but any attempt to interact with the 11.x operating system (like loading any .sl files) will result in failure.

We have supplied lisp and libacl*.sl for both HP-UX 10.20 and for HP-UX 11.x. all .dxl files remain completely compatible, and can be run on either os version as long as the libacl*.sl is running on its native os level.

Failures:

In either case, the fix is to use the correct libacl*.sl for the version of HP-UX on which you are running. Both versions are supplied in each distribution, and both distributions should be supplied to customers if/when you distribute your application.

Features and the software-version function:

The *features* list will always have :hpux in it, but the Lisp will ensure in addition that the appropriate one of either :hpux-10 or :hpux-11 is added to *features* but always corresponding to the nativity of the libacl*.sl being run. Thus, if the warning is ignored and the libacl*.sl built on HP-UX 10.20 is run on HP-UX 11.0, the *features* list will have :hpux-10, and not :hpux-11.

The Common Lisp software-version function will return a string representing the current operating system on which the lisp is running, regardless of the nativity of the libacl*.sl. Thus a lisp running on HP-UX 11.0 will always return a string similar to "HP-UX gooey B.11.00 U 9000/777 ..." and a lisp running on a 10.20 system will return a string similar to "HP-UX heavy B.10.20 A 9000/780 ..."

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.


Compaq (formerly DEC)-running DEC UNIX-specific information

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.


Compaq (formerly DEC)-running-NT-specific information

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.

Allegro CL is only supported with the Operating System Windows NT with Service Pack 4. It will not work with a service pack less that 4.

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.


SGI-specific information

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.


AIX-specific information

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.

Allegro ODBC, version 2 users: Allegro ODBC now works on AIX 4.2.1 or later, with Merant (formerly Intersolve) DirectData drivers 3.11. Be sure to install the nothread version, as described in the /opt/odbc/READ.ME file.

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.


Linux-on-Intel-specific information

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.


Linux-on-PowerPC-specific information

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.


FreeBSD-specific information

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.


Windows-specific information

Many entries in this document are either Windows-specific or contrast Allegro CL on Windows and Allegro CL on Unix.

See Available Platforms for Allegro CL in readme.htm (the Installation Guide) for supported versions of the operating system.

See About the Lisp Heap in this document for information on the starting locations of the Lisp and C heaps in the images on the CD.


The executable and image files are different

This entry reports a change from 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

This is not a new feature for users of Allegro CL 3.0.x for Windows but it is a significant change for users of Allegro CL 4.3.x on Unix platforms.

In Allegro CL 5.0.1, there is a small executable file, initially named lisp (on Unix) and lisp.exe (on Windows) and a large image file (extension dxl). The executable file cannot be created by users. However, the same executable should work (on a particular platform) with any image file. The name of the executable file is significant only because it provides the default name of the image file. (Thus, lisp looks for lisp.dxl by default.) The image file to use can be specified with the -I command-line argument. See startup.htm for information on specifying an image file.

Because the executable and image files are different, standalone images are not possible. (In Allegro CL 4.3.x and earlier on Unix, it was possible to generate a single executable image file that depended on no other file. In 5.0.1, that is not possible.)


The Home Location/Allegro directory

This entry reports a change from 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

The home location (used in 4.3.x on Unix) concept has changed. The home location was (in 4.3.x) the location of files needed while Lisp was running. It was specified to Lisp by the ALLEGRO_CL_HOME environment variable In even earlier versions, it was called the Lisp library location.

Allegro CL 5.0.1 uses the fact that the executable and image files are separate, as we describe in more detail in the next section. The location of the executable is taken to be the location of the files needed while running, corresponding to the 4.3.x home location. There is no need to specify this location to a running Lisp since the executable location is known automatically to a running program. We no longer call this location the home location (although you may see that term occasionally in the documentation.) Instead, it is called the Allegro directory. The directory in which Allegro CL was installed is also called the Allegro directory. We use the same name because they are usually the same location.

Allegro CL 3.0.x for Windows always had separate executable and image files.


Running Allegro CL 5.0.1

Other than changing the version number to 5.0.1 and adding a reference to the International Allegro CL executable, there are no changes in this entry from the 5.0 Release Notes.

The basic model in which Lisp is constructed has changed. Previously, on Unix systems, Lisp was a single executable and the function excl:dumplisp created executables. Lisp has now split into several components:

Component Description
The executable program
(called lisp on Unix and lisp.exe on Windows for standard Allegro CL, and lispi/lispi.exe for International Allegro CL)
The executable file is a program, and this is what you run. This program is static; it never changes (unless you were to get a patched version from us).
An image file The image file contains Lisp data, including the Lisp heap. This file typically has extension dxl.
The ACL shared library
(a .so or .sl file on Unix and a .dll file on Windows)
The shared library contains the operating system interface and initialization routines needed to run Lisp. It is a shared library in the operating system sense.

All of these components reside, by default, in the same directory. This location is called the Allegro directory, (it was called the home location in 4.3.x on Unix and you may see that term in the documentation). The -H command line argument can be used to specify a location other than the location of the executable as the Allegro directory.

When run, lisp (of lispi) performs the following tasks:

  1. determines the Allegro directory,
  2. loads the ACL shared library, and
  3. finds and loads the image file.

lisp/lispi will print verbose messages about what it is doing on startup if the environment variable ACL_STARTUP_DEBUG is present.

The ACL Shared Library

Unix The LD_LIBRARY_PATH environment variable (and similarly named variables on various Unix systems) is not used when loading the ACL shared library.
Windows The ACL shared library is in the Windows System directory.

Finding and Loading the Image File

The -I argument to the executable (initially lisp on Unix and lisp.exe on Windows) determines the location of the image file to load. If the -I argument is not given, then the following heuristic is used to find an image file:

  1. The basename (non-directory portion of the pathname) of the Lisp executable less the type is concatenated with .dxl. That is, /foo/bar/lisp.exe is turned into a default image name of lisp.dxl, and /foo/bar/lisp is turned into lisp.dxl.

    On Unix, if the Lisp executable was started via a symbolic link, then the name of the link, not what it points to, is used as the basename mentioned above. That is, running Lisp from a symbolic link /usr/local/myapp that points to /usr/local/acl5/lisp would make the default image name myapp.dxl, not lisp.dxl.
  2. If the default image name exists in the home location, use it.
  3. If the default image name exists in the current directory, use it.
  4. Otherwise, signal an error that the default image file could not be found.

If the -I argument to lisp is given, then the following heuristic is used to find an image file to load (for the purposes of this example, the name of the -I companion argument is imagefile):

  1. Append .dxl to imagefile if it does not already have a type.
  2. If imagefile contains a directory component, then check to make sure imagefile exists. Use it if it does, signal an error if it does not.
  3. If imagefile exists in the current directory, use it.
  4. If imagefile exists in the Allegro directory, use it.
  5. Otherwise, signal an error that the given image file could not be found.

Example: if (on Unix) lisp is copied to myapp or (on Windows) lisp.exe is copied to myapp.exe, and you then create a myapp.dxl in the same directory as the executable, then myapp is equivalent to myapp -I myapp.

If Lisp was built with a .pll file, then the same search rules above for finding a supplied image file apply to finding the .pll file. On Windows, the Windows system directory is also searched (system on Windows 95/98 and system32 on Windows NT).

On Windows 95/98/NT, you can also run Allegro CL from the Start | Programs | Allegro CL 5.0.1 menu.


Top-Level Initialization

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

The first one of .clinit.cl or clinit.cl in the commonly-searched directories (the user's home directory and the current directory on Unix, C:\ and the Allegro directory on Windows) is now loaded. See the variable excl:*init-file-names*.


The Integrated Development Environment (IDE) [Windows only]

The IDE and the Common Graphics window system are only available on Windows platforms.

See <Allegro directory>\cg\cgide.hlp for extensive documentation of Common Graphics and the IDE. See the Release notes entry in that file for extensive discussion of changes in 5.0.1 compared to 5.0. Only a few items are kept here.

Limitation

Description

Single-Process Limitations There is a one-to-one mapping between Allegro CL processes and operating system threads. Common Graphics in Allegro CL 5.0.1 must run within a single Allegro CL process. This is forced by the mapping plus the limitation of Microsoft Windows that events for a window can only be received on the thread that creates the window, as well as the limitations of Common Graphics itself.

When the Integrated Development Environment (IDE) starts, a special process named IDE/Common Graphics is created. All Common Graphics and IDE functions are run within this process. When interacting with the Debug Window, the current process (i.e., the value of sys:*current-process*) is this same IDE/Common Graphics process. Therefore, it is possible to create windows and other Common Graphics entities directly as function calls from the Debug Window.

Windows version 3.02 Users: this is similar to the features and functionality in Toploop.

In processes other than the IDE/Common Graphics process, it is not possible to create Common Graphics entities that require event handling (e.g., Common Graphics windows). Attempts to do so in Allegro CL 5.0.1 signal an error. Therefore, you should not attempt to run Common Graphics functions from the Console, GNU Emacs Lisp Interface listeners, or any other listener outside the IDE/Common Graphics process.

Finding the boundaries of the toplevel form: All editor commands that need to find the boundaries of a toplevel form (e.g. beginning-of-definition or incremental-evaluation-command) find the start of a form simply by searching back from the cursor position for the closest open parenthesis in the first column.

The alternative would be to parse the entire file. This actually is what the Lisp reader does when the compiler or loader reads the file, but using this as an alternative would cause unacceptable delays for large files, and would fail completely if the entire file were not syntactically correct. This is often the case when a file is actively being edited. So this is an unacceptable solution.

Solution: searching backwards to the closest open parenthesis in the first column is simple, fast, and almost always suffices.

  • Be aware that editor commands may not do what you want if some internal open parenthesis of a form is unindented, or conversely, if the first parenthesis of a form is not in column one. You can re-indent a form by placing the cursor on the initial parenthesis and choosing Edit | Reindent.
Loss of keyboard shortcuts: When using the File | Build Project Distribution menu item, at the end of the process of building the Project distribution a dialog box will pop up.  If this dialog box gets buried (you do not dismiss it by clicking on OK), then the keyboard shortcuts in the IDE will stop working.  They will start functioning again when you dismiss the dialog box.

Allegro Composer

Allegro Composer is only available on UNIX platforms.

There is no mouseline window (even though the documentation mentions one). Instead, Allegro Composer must be run as a subprocess of Emacs. Menus in emacs provide the functionality previously provided by the mouseline window.

The following symbols have been removed and can no longer be used:

    composer:*composer-display-specification*
    composer:*use-notifier-windows-for-errors*
    composer:*show-lisp-status*

Information Specific to Users of International Allegro CL

There have been extensive changes in release 5.0.1. See iacl.htm#2.2 New in Release 5.0.1. Also:

For streams and foreign functions, the external-format used by iacl on Windows is different than that used by iacl on Unix. On Unix, we use EUC externally and Process-Code internally. On Windows, we use Windows MultiByte externally and Unicode internally.

This means, in particular, EUC source/text/data files specifying non-ascii data can not be read with Windows iacl, and Windows MultiByte source/text/data specifying non-ascii data files can not be read with Unix iacl.

We are also not supporting reading back files written using 16-bit string data that are written across the Windows/Unix boundary.

Any lisp strings passed to foreign functions or any lisp strings being stored in (or copied into) foreign structures used by foreign functions need to be converted (with either string-to-native, string-to-mb, or with-native-string). This is necessary even if only ascii characters are ever used in lisp strings passed to foreign functions.

The reason for this restriction even for ascii-only strings is that iacl lisp internally uses a flat wide-character representation where each character is 16-bits wide. Thus, looked at from an 8-bit byte point of view, every other 8-bit byte is zero.

Foreign functions expecting to receive 'char *' arguments assume that the only 8-bit byte holding all zeros (ie, the NULL character) occurs only after the last character of the string.

Thus, in iacl, if an unconverted lisp string of all ascii characters is passed to a foreign function expecting a 'char *' argument, the foreign function will (depending on machine byte-ordering) behave as if the string is null-terminated either before or after the first character.

Also, note the following difference with the non-International version of Allegro CL:

The vector version of run-shell-command is not supported, and the non-vector version is limited to 8192 (wide) characters.

See Also
iacl.htm


Profiler

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

On Windows, the profiler works best when the scheduler is running, as in that mode it is able to take a sample nearly every millisecond. When the scheduler is not running, the profiler can, at best, take a sample every 13 milliseconds.

The profiler has also been enhanced to separate closure calls.

prof:start-profiler and prof:with-profiling have a new keyword called :interpret-closures.   See the discussion of the :interpreted-closures keyword in the prof:start-profiler page.

A function specialization called prof:closure has been added. This is valid whenever an analyzed profile exists and identifies the closures which the profiler has seen. The specialization is (prof:closure n) where n is a small integer enumerating the closures in the profile. This allows the user to grab the closure object and to do a prof:disassemble-profile on it without having to know what symbol holds as its fdefinition (sometimes this is very hard).

When flat profiles and call-graphs are reported, closures are identified by (prof:closure n), followed by the printed representation of the closure object itself.

See Also
Profiling


About the Lisp Heap

This section contains information intended for advanced users with very large applications. Most users can skip this section until they need a heap larger than the default.

The address into which the heap is loaded is architecture-dependent. It is potentially important for you to know this, in case you use the operating system primitives for memory mapping or want to move the heap from the default location in memory. The values in the table are in hexadecimal format. 0x400 is 1K. 0x100000 is 1M. 0x40000000 is 1G.

Architecture/OS Lisp Heap Start C Heap Start
DEC Unix (Dec/Compaq Alpha) 0x30000000 0x54000000
HPUX (on HP machines) 0x10000000 0x64000000
Linux (Intel-based machines) 0x20000000 0x64000000
MkLinux/LinuxPPC (PowerPC) 0x30000000 0x64000000
IRIX (SGI Mips machines) 0x30000000 0x64000000
AIX (RS6000 and PowerPC) 0x30000000 0x64000000
Sparc/Solaris(Sun machines) 0x04000000 0x54000000
Windows 95/98 & NT (Intel-based machines) 0x20000000 0x54000000
Windows NT (DEC/Compaq Alpha) 0x30000000 0x54000000
FreeBSD (Intel-based machine) 0x10000000 0x64000000

Specifying Heap Size and Placement

See building_images.htm for information on excl:build-lisp-image's :lisp-heap-start, :lisp-heap-size, :c-heap-start and :c-heap-size keyword arguments for information on specifying the heap sizes and starting locations. The Lisp heap start must be below the C heap start.


Changes to malloc and free

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

Allegro CL has always used some calls to malloc to allocate static blocks of data, and has provided an implementation of malloc and free (and other functions) that is both compatible with the system version of malloc and satisfies Allegro CL's requirements. The implementation was called pdmalloc.c and was freely available in source form on the FTP site. The malloc space was always preserved using excl:dumplisp, and the programmer could always count on any block allocated in this space to be still at the same location after the dumped lisp was restarted. Under this system, all calls to malloc were shadowed and were in reality calls to this pd version of malloc.

The malloc situation has changed in Allegro CL 5.0.1. The malloc and free functions (along with other functions associated with malloc) are no longer shadowed by our own implementation, but are taken again from the system libraries. Instead, we introduce aclmalloc and aclfree, and provide interfaces both in C and in Lisp to these functions. aclmalloc allows three possible allocation strategies:

  1. As before, the allocated block is not at all relocatable, and any attempts to do so result in a failed Lisp restart.
  2. If the block contains no internal C pointers, the block itself can be moved if necessary. The creator of the block is responsible for finding all pointers to the block and adjusting them.
  3. If the block contains C pointers internally, then it is possible to call a function to relocate pointers within that block.

Warning: The syntax for the above changes are in place, but the functionality for items #2 and #3 are not yet implemented. Thus, the C portion of the heap must stay in one place as of ACL 5.0.1.

In 5.0.1, a decision will need to be made as to whether the data to be allocated should live across excl:dumplisp boundaries; if the data must live across excl:dumplisp boundaries then aclmalloc should be used, otherwise malloc should be used.

Rule of thumb for using aclmalloc vs. malloc If the data is "owned" more by Lisp functionality than C functionality, it should be allocated via aclmalloc, and if the data is owned more by C functionality than by Lisp then it is better to use malloc instead.

As always, there will be exceptions and non-obvious cases requiring more judgement than this rule can give.


build.exe vs. lisp.exe (Windows only)

This entry reports a change from 3.0.x on Windows to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

build.exe is a WIN32 console application, whereas lisp.exe is a WIN32 Windows application. If you want to run a command-line oriented version of ACL, use build.exe, but otherwise you should use lisp.exe. lisp.exe is intended to be used for development and delivery of applications on Windows.

There are issues with multiprocessing and build.exe. build.exe sometimes cannot tell if input is available or if a process that is waiting on input should wake up. For this reason, we recommend you do not use build.exe with multiprocessing applications.

International versions have buildi.exe and lispi.exe, the International versions of these applications. They work just as build.exe and lisp.exe do for the Domestic versions.

Note: build.exe does not accept the arguments that begin with +.

lisp.exe (Windows only)

This entry reports a change from 3.0.x on Windows to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

Under normal circumstances, when lisp.exe is run it displays a window containing a read-eval-print loop, which we call the Console window. International versions of Allegro CL have lispi.exe, which is the International version of lisp.exe.

In addition to the Console Window, the Windows Explorer tray icon can be used to interact with the Lisp. Double left-clicking on this icon in the tray makes the Console visible (if necessary it will un-minimize and/or un-hide it, and it will raise it above other windows). A right click on the icon brings up a menu. There is a bug in that you have to click on the menu (or another Lisp-controlled window) to dismiss the menu. As a result there is a do-nothing menu item called Dismiss menu which you can use until we fix this bug.

See the next section, New Command Line Options, for information on newly available arguments to lisp.exe.

Quoting of arguments via the Windows Explorer is somewhat confusing. To load a file (foo.cl is used for example) from a short cut or from the Start | Run... menu, you could do this:

lisp.exe -I dcl -e "(load "foo.cl")"


New Command Line Options

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

-C file Evaluates (compile-file file)
-d file Causes dribbling to file.
-H directory Overrides the default home location calculation using directory
-kill Evaluates(exit 0)
-L file Evaluates (load file)
-Q Allows quiet startup (without pll, dll and dxl messages)
-W Evaluates (setq *break-on-warnings* t)

See Also
3.0 Command line arguments in startup.htm


Building Custom Lisp Images

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

In Allegro CL 5.0.1, the Lisp function excl:build-lisp-image is used to create custom images. (It is the rough equivalent of the config program in release 4.3.x on Unix.) Note that except for defaults for certain arguments, the newly created image inherits nothing from the running image. If foo is a function defined in the running image, foo will not be defined in the new image unless code to define it was loaded during the build process.

The document building_images.htm is the best place to learn about build-lisp-image. The description page for build-lisp-image (follow that link) is less complete (we are trying to avoid having two locations for the same information).


Pathnames on Windows

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

See 5.0 Parsing Windows pathnames in pathnames.htm for more information.


Some Windows-Specific information

This entry reports a change from 3.0.x on Windows to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

Interrupting Lisp

On Windows, when the Console window is the active window, typing the BREAK key will send an interrupt to Lisp. Previously the F12 key was the interrupt key. It is still the case that if Lisp is in a loop where it isn't checking for interrupts, it is not possible to break Lisp out of this loop using the BREAK key.

Lisp Scheduler

If the Lisp scheduler is running and the variable mp::*message-peek-mode* is set to 1, then Lisp will not process Windows messages, and instead the scheduler will set mp::*pending-windows-message* to t and then look for a Lisp process that is run-able. This means that a user can create their own Lisp lightweight process to process Windows messages.

The advantage of this is that it gets around the problem that errors cannot be debugged on the scheduler stack group (which is where Windows messages are normally processed). This is an experimental feature, subject to change. This variable is initially 0.

New Functions

sys:set-splash-bitmap (Windows only).

sys:stack-cushion and sys:set-stack-cushion.

Multiprocessing

See also multiprocessing.htm for information on changes affecting Windows multiprocessing users.

OLE Interface

There is now a low-level OLE interface for Windows only.


Differences Between Unix and Windows Versions of Allegro CL

There is no new information in this entry for 5.0.1.

Foreign Code The only foreign code that can be loaded into Lisp is that in Dynamic Link Libraries (DLLs). Object files themselves cannot be loaded into Lisp. See the section on the Foreign Function Interface for more information.
Home Directory The .clinit.cl or clinit.cl files are loaded from the "home directory and the current directory". Those terms are meaningful on Unix but not really on Windows. On Windows, the home directory is hardwired to C:\. The current directory is the location of the executable (typically, the Allegro directory).
Pathnames See Pathnames on Windows.
run-shell-command differences See excl:run-shell-command.
sbrk() There is no sbrk() in the Microsoft C runtime library. The WIN32 API function VirtualAlloc() can be used to allocate large blocks of memory. This method might be preferred over using malloc(), depending on how malloc() is implemented on Windows (which is unknown to us).

When using dumplisp, understand that memory allocated with VirtualAlloc() and malloc() is not saved in the resulting image file. excl::malloc does not call the C runtime library version of malloc(). It calls another version (internal to ACL), and this memory is saved and restored by dumplisp.

End of line convention in text files:
carriage return, line feed, and newline issues.
In a file containing text, Windows separates lines by two characters: a carriage return (ascii #x13) and a linefeed (ascii #x10). A Common Lisp program wants to use one character (which it calls #\newline) to separate lines.

This incompatibility is solved by specifying a mode for every Common Lisp stream that reads or writes a file. The mode of a stream can be specified by the :mode argument to cl:open. If there is no :mode argument then the :element-type argument determines the mode in this way: if the element type is character (which is the default) then :text mode is used, otherwise :binary mode is used.

Specifying the :text mode means that when Common Lisp writes a #\newline, the carriage return and linefeed characters are written to the file. :text mode also insures that when a carriage return and linefeed are read from a file, the single character #\newline is returned by read-char. Files opened in :binary mode don't get this translation.

One further feature of :text mode is that a CTRL-Z character is an end of file marker; you can't read past a CTRL-Z in :text mode. This is required by our use of the built-in support for text mode in Windows. If we move the text mode processing into Lisp, then we will likely remove this behavior.

SIGIO The SIGIO facility is not implemented on Windows. This facility uses Unix features not present in Windows. There are no current plans to implement it in a future release of ACL on Windows. (See set-sigio-hander.)

Differences When Running on Windows 95/98 and NT

There is no new information in this entry for 5.0.1.

Our goal is to make the NT and 95/98 versions of Allegro CL exactly the same from your point of view. This section details the features we have been unable to make identical on both systems.
Mapping the Lisp Heap:
NT: On NT, the heap is mapped (from the .dxl file) into memory (with the WIN32 memory mapping primitives). This allows for much faster startup, especially when starting up multiple times using the same image.
95/98: On 95/98, mapping the heap does not work because the memory mapping primitives do not work there. This is a "feature" of Windows.

Notes:

.pll file mapping works identically on Windows and NT.
See the section on pure Lisp libraries for more information on .pll files.
See About the Lisp Heap if you need to change the default settings.
Profiling:
  In both versions of Windows we sample using a real-time clock.
NT: A clock interrupt results in a sample if there's a thread that has used the processor most of the time since the last tick.
95/98: We can't tell how much time the processor uses, so we take a sample if the current thread owner isn't in a sleep or a wait.

This really only affects non-mp mode on 95/98, and means that you won't get samples inside a foreign subroutine call for which Lisp released the heap. We have no way of knowing whether such a foreign function is burning cycles or sitting in a long-term wait. Thus we can't reliably produce information from such samples.


User Control of Application Termination (Windows only)

This entry reports a change from 3.0.x on Windows to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

See excl:console-close.


Pathnames and File Changes

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

The following items have undergone change or are new for this release:

New behavior:
equal equal now compares the host and device fields of a pathname with equalp.
excl:*open-rename-function* (new defaults)
*default-pathname-defaults* *default-pathname-defaults* now starts as the value of (excl:current-directory).

*default-pathname-defaults* in ACL 4.3 was #p""; the pre-4.3 behavior has been reinstated.

logical-pathname-translations logical-pathname-translations has a new :autoload keyword (default value t) which causes it to look at the sys:hosts.cl file, if that file hasn't already been loaded. Normally, load-logical-pathname-translations must be explicitly called to load the translations for a particular host.
merge-pathnames The first argument of merge-pathnames is now translated if it is a logical pathname--before any merging is done--when that pathname is a relative logical pathname and default (the second argument) is a physical absolute pathname. 
See also: Merging Directory Components via merge-pathnames
(namestring
(make-pathname
  :directory
  '(:absolute
    :wild-inferiors)))
This previously printed as a relative pathname on Unix and Windows.
New Functions:
excl:copy-directory
excl:delete-directory
excl:delete-directory-and-files
excl:directory-size
excl:map-over-directory
excl:make-directory
excl:pathname-as-directory
excl:pathname-as-file
excl:pathname-sans-file

system:copy-file
system:make-temp-file-name

system:temporary-directory
Un-exported Symbols:
system:mkdir

system:rmdir

See excl:make-directory and excl:delete-directory.

Merging Directory Components via merge-pathnames

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

The first argument of merge-pathnames is now translated if it is a logical pathname--before any merging is done--when that pathname is a relative logical pathname and default (the second argument) is a physical absolute pathname.

There is a problem with the behavior of the merge-pathnames on the directory component of pathnames, when first argument is a relative logical namestring/pathname and the second argument is absolute and either:

  1. non-logical, or
  2. logical with a different host

Examples of this are:

(merge-pathnames "src:;sys;make.cl" "/burn/layer/")
(merge-pathnames "src:;sys;make.cl" "bar:;burn;layer;") 
ANSI CL rules for merging Pathname merging treats a relative directory specially. If (pathname-directory pathname) is a list whose car is :relative, and (pathname-directory default-pathname) is a list, then the merged directory is the value of:
(append (pathname-directory default-pathname)
		        (cdr ;remove :relative from the front
		          (pathname-directory pathname))) 

except that if the resulting list contains a string or :wild immediately followed by :back, both of them are removed. This removal of redundant :back keywords is repeated as many times as possible. If (pathname-directory default-pathname) is not a list or (pathname-directory pathname) is not a list whose car is :relative, the merged directory is:

(or (pathname-directory pathname)
		    (pathname-directory default-pathname))  
In the non-logical world, merging relative and absolute directories is straightforward and very clear; what you see in the directory namestring of the relative pathname is what is appended to the end of the absolute directory.

For instance:

(merge-pathnames "some/day/" "/burn/layer/")

yields a straightforward #p"/burn/layer/some/day/".

However, with a relative logical pathname there is often a hidden directory component that you cannot see unless you perform the translation. For example, in the pathname #p"src:;sys;make.cl", there is no way (except by examining the translation itself) to know what the directory component of the translated pathname will be. So, according to the directory merging rules above (merge-pathnames "src:;sys;make.cl" "/burn/layer/") would evaluate to #p"src:burn;layer;sys;make.cl", which probably will not make any sense.

The solution to this problem is stated at the beginning of this discussion: having the first argument translated in a particular way under specific conditions before any merging is done.

The ANSI merging rules above indirectly state that an absolute directory component as the first argument to merge-pathnames is untouched. Is #p"foo:"bar"baz.cl" a relative pathname? It is relative with respect to the directory contained in the logical translation, which is most likely different than the physical translation, often an absolute pathname.

The only statement in the ANSI specification about logical pathnames in the merge-pathnames definition:

merge-pathnames returns a logical pathname if and only if its first argument is a logical pathname, or its first argument is a logical pathname namestring with an explicit host, or its first argument does not specify a host and the default-pathname is a logical pathname.
The ANSI specification does not address the issues raised here, so we have decided on an intentional non-conformance and to translate the logical pathname under the specific conditions listed at the beginning of this discussion above.

Consequently, merging ".." with absolute pathnames is changed. For example, (merge-pathnames ".." "/") returns #p"/".

See Also
pathnames.htm


The Compiler

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

In certain cases apply is now compiled more efficiently, to remove consing. Consider the following code:

(defun foo (x &rest y) (apply fcn 1 x 2 y))

The &rest argument is used to supply a variable length argument list to apply. This case is now compiled in such a way that

  1. The last argument to apply is not actually used, but an index to the n'th argument to foo is compiled instead.
  2. The &rest argument is considered dead as if declared ignored.
  3. All aspects of the function are preserved
      (Example: possible argument checking for a minimum but not a maximum number of arguments).

In this optimized case, the code works exactly as it did when the &rest argument was consed, but without the consing.

Conditions that will cause this optimization to not be used:

Optimization hint: the following call to apply will not be optimized:

(defun wrap-it (flag &rest x &key &allow-other-keys)
  (when flag
    (setq x (list* :new-key 10 x)))
  (apply 'wrapped flag x))

If non-consed operation is desired, then the following modification will allow the optimization:

(defun wrap-it (flag &rest x &key &allow-other-keys)
  (if flag
      (apply 'wrapped flag :new-key 10 x)
    (apply 'wrapped flag x)))

Compiler-Related Changes

Symbol or Feature Change
comp:verify-car-cdr-switch Reinstated due to the fact that although alignment traps are caught on almost all architectures, the operating systems will not allow for recognition of misalignment, so list-ness of the object being accessed via car/cdr cannot be verified by hardware.

Those versions of Allegro CL in which verify-car-cdr-switch will have an effect now have :verify-car-cdr on the *features* list.

*compile-print* Initial value is nil instead of t.
Fasl files (.fasl) Now identifiable in their first bytes, which are textual lines. This includes architecture, dates, and compilation settings at the time of the fasl write. The textual information about these global settings is accurate as long as speed, safety, and other settings do not change during the file compilation.
comp:list-call-direct-possibilities list-call-direct-possibilities is a new function, callable with no arguments. It returns a list of lists of descriptions which should aid in call-direct compilation.

Each list represents a kind of argument or return value, and starts with a string describing what the rest of the list describes.

For those descriptions which start "bad ..." the types listed will force the compilation of a call to the function to be compiled out-of-line. The other lists describe those argument/return types required in order to compile the call as a direct-call. These types are Lisp types or specifiers; they can either be explicitly specified as the Lisp type or implied by the C type of the argument or the return value (see the description of ff:def-foreign-call in Foreign Functions).

Diagnosing Bad dynamic-extent Declarations

The value of the variable comp:trust-dynamic-extent-declarations-switch (on by default) is a compiler switch that controls the trusting of dynamic-extent declarations. So the following declaration is trusted by default:

(declare (dynamic-extent ...))

The value of trust-dynamic-extent-declarations-switch can be set to nil if you suspect you have a bad dynamic-extent declaration. This would be the case if you use a variable declared dynamic-extent past the dynamic extent of the point of creation of the variable on the stack.

For example, in this definition:

(defun foo (&rest bar) (declare (dynamic-extent bar)) bar)

bar is erroneously declared dynamic-extent. This could be the cause of difficult-to-diagnose Lisp and garbage collection errors.


Removed Symbols

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

Symbol Notes
*optimize-intern-for-space* This symbol worked only on symbol names, and was not adding anything in the way of performance, so it has been removed. Especially in a Lisp with an lso (.pll) file,  it slowed things down to a crawl.

If you have used *optimize-intern-for-space* in your code, you should now use a .pll ("pure") file to arrange for sharing of duplicate strings. It's not as slow as the original switch was, and gives a better result.

The pure library now works for all strings, not just symbol names.

excl:*stream-package* The stream package has been merged into the excl package (and stream is now a nickname of excl).

The value of excl:*excl-package* is the excl package.

rmdir and mkdir rmdir and mkdir are renamed to delete-directory and make-directory.   rmdir and mkdir are no longer exported from the excl package; do not use them.

Conditionalizing Lisp Code

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

See the 5.3 Reader macros and cl:*features* in implementation.htm for features (on cl:*features*) on which Lisp code can be conditionalized.


defsystem

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

There are three new long-form module options supported in the defsystem utility. See defsystem.htm for the definition of each of the new options.

New Options:
:concatenate-system-ignore
:force-dependent-recompile

:force-load

New disassemble functionality

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

See implementation.htm for changes to the disassemble function.


top-level stream variables

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

*trace-output* and *error-output* are bound on a per-listener basis (like *standard-input*, *standard-output*, *debug-io*, and *query-io* always have been) to *terminal-io* for that listener.
A listener process-related change: Because these specials are bound in listener processes, they were removed from the bound per process variables list. Specifically, all of these variables are no longer required top-level bindings.

:local Debugger Command

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

The :local debugger command now accepts :x as a flag and will print integer arguments in hexadecimal.


excl:dumplisp

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

The :checkpoint argument to excl:dumplisp is ignored. A warning is issued if it is used. The default value for the dumplisp keyword name is "savedcl.dxl" (from "savedcl").

A new keyword to excl:dumplisp, :suppress-allegro-cl-banner, can be used to suppress the Franz Inc. copyright and startup banner.

When this keyword argument is given to excl:dumplisp and it has a non-nil value, then a warning will be issued.

See Also
Application Delivery in Allegro CL


The Emacs-Lisp Interface

Repeating the information from Emacs-Lisp interface changes in 5.0.1 above:

There are two new variables:

fi:connect-to-windows
fi:common-lisp-subprocess-wait-forever

Both have doc strings and are discussed in ../../eli/readme.htm.


The Foreign Function Interface

This entry reports a change from 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

There is a separate foreign_functions.htm describing the foreign function interface, which has had major changes since Allegro CL 4.3.


Foreign File Processing

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

Foreign file processing behavior can differ slightly, depending on your version of Lisp.

Versions of Lisp with :dlfcn on *features* (e.g., SunOS 5.x):

  1. If :unreferenced-lib-names was given, then make sure all entry points are defined and return.
  2. If the searched pathname is non-nil and there is no directory or host component to this pathname, then merge in a ./ into the pathname. This forces load to only look in the current directory for the foreign file.
  3. If the searched pathname is nil and there is a directory or host component to this pathname, then signal an error, since dlopen() will not find the pathname.
  4. Use dlopen() to map the searched pathname into the address space and return.

Versions of Lisp with :dlwin on *features* (e.g. Windows):

  1. If the searched pathname is nil and the argument pathname has a directory, device, or host component, then signal an error, since GetModuleHandle() will not find the pathname.
  2. Use GetModuleHandle() to map the searched pathname into the address space and return.

If :dlfcn or :dlwin is not on *features*, then there are no changes in foreign file processing.


Changes in the Semantics of cl:load

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

The semantics of load have been changed to accommodate finding foreign files when just a name and type are given. What load does is fairly complicated, so we offer a description here.
  1. Determine the argument type
  2. Based on the type, do one of two things:

    If the argument is a stream, load from it (as a Lisp or fasl file) and return.

    If the argument pathname is "" or nil, then one of the keyword arguments :foreign-files, :system-libraries or :unreferenced-lib-names must be given.

    In this case, do the foreign file processing and return.

    Note: on ports which have :dlfcn or :dlwin on the *features* list, :foreign-files and :system-libraries are rejected keyword arguments.
  1. The argument filename is converted to a pathname, called the argument pathname. The argument pathname is now put through search list processing, yielding the searched pathname. If the search was successful, the argument pathname is set to the searched pathname.
  1. If the searched pathname has a type given by *load-foreign-types* (the test is case insensitive on Windows), do the foreign file processing and return.
  1. If loading from the bundle or the searched pathname has a type given by *fasl-default-type* or fasl (the test is case-insensitive on Windows), load the fasl file and return.
  1. Load the Lisp source file and return.

Search List Changes

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

sys:*autoload-search-list* and sys:*require-search-list* have been changed to look for the first and not the newest match.


excl:run-shell-command

There have been changes to this function to accommodate Windows. Follow the link to see why, despite the name, shell commands cannot be run in Windows.


The inspector

5.0: The :i command allows a new mode to be set, called raw mode. 5.0.1: See the example at the end of inspector.htm to see how hashtables are now inspected.


Garbage Collection

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

See excl:gc-before-c-hooks and excl:gc-after-c-hooks for changes in the gc hooks.

Garbage collection printing messages are turned off by default. Put (setf (sys:gsgc-switch :print) t) in your clinit.cl if you want the default as it was in ACL 4.3.

A problem with the :global-gc-before-expand gsgc switch in Allegro CL 4.3.x has been fixed.

Garbage collection is documented in gc.htm.


Hash Tables

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

See implementation.htm for a discussion of the two new keyword arguments to make-hash-table, :values and :weak-keys. There is a new hash function called excl:puthash-key.


New make-array functionality

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

See implementation.htm for a discussion of the new :allocation keyword argument to make-array.


Packages

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

See  section 6.1 Compatibility with pre-ANSI CLtL-1 in Allegro CL in implementation.htm for information on package changes. This is most relevant to users upgrading from Allegro CL 3.0.2 for Windows, since that product used CLtL-1 package semantics for the most part.


Porting Applications to Allegro CL 5.0.1

There is no new information in this section for 5.0.1 compared to 5.0.

This section is intended for users of earlier versions Allegro CL.

There is a help document especially for Windows users on Porting called porting.hlp, located in the <Allegro directory>/doc/cg/ directory. Two different sample applications are ported and discussed.  The first example is ported in both a rapid way (using the ACL WIN compatibility package in the Build Includes) and in the more thorough way.  The second example is ported only in the rapid way.

The entire set of porting examples takes about an hour to read and work through.  We highly recommend this as an introduction to porting issues, particularly on Windows. Read through the Porting help document before beginning to port your projects into Allegro CL 5.0.1.

See Also
ACL WIN 3.0.2 Compatibility Issues


Pure Lisp Libraries (formerly .lso files)

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

Pure Lisp Libraries (called .pll files) allow code vectors and strings to be moved from the Lisp heap into read-only files which are mapped into memory in a shared mode. This is often more efficient, because the garbage collector does not have to scan those objects and multiple Lisp (operating system) processes share that memory mapped region (on most machines).

Building an application that uses a .pll file requires the following (Windows-specific) procedure:

Step 1 Record your code vectors and strings into .cvs and .str files, respectively. Start Allegro CL and load your application. In an image with your application loaded, use this code to find all the code vectors and strings associated with the application:
(sys:write-codevectors "foo.cvs" t)
(sys:record-strings "foo.str"
 (let ((vec (excl::get-objects 7)))
   (dotimes (i (svref vec 0))
     (excl::maybe-purify-string
      (symbol-name (svref vec (1+ i))) t))))
Step 2 In the Allegro CL directory, run the cvdcvt.exe command to combine .cvs and .str files into a single .pll file. The first command puts your strings and code vectors into foo.pll and the second one puts those and the base Lisp ones into foo.pll:
cvdcvt -o foo.pll foo.cvs foo.str
cvdcvt -o foo.pll foo.cvs foo.str lisp.cvs lisp.str
Step 3 See Building Custom Lisp Images for instructions on building a new Lisp image without a .pll file, and follow those instructions. Call the image lisp2.dxl. Note: Steps (3) and (4) can be combined into one step: using the information in Building custom Lisp images, you can build foo.dxl directly using foo.pll, without the step of building lisp2.dxl. If you are going to build multiple images, the extra step might save you time.
Step 4 Build a new .dxl file which uses your new .pll file:
lisp -I <Allegro directory>\lisp2.dxl
(use-pll-file "foo.pll" :global-gc t)
(dumplisp :name "foo.dxl")

See Also
misc.htm
(information on plls)


Specialized Array Types

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

fixnum

The fixnum array type has been removed; it caused unexpected performance problems.

If an element type of fixnum is specified, it is now upgraded to (signed-byte 32). This performs exactly like the fixnum arrays did: it requires a shift, and, if Lisp values are properly declared, accesses will not require a test for bignum-ness. If storage into arrays with no shifting is desired, use arrays of type t.

nybble

A new nybble array is now available. It is specifically a (array (unsigned-byte 4) *), and includes both array headers and simple vectors. Internal access is not extremely fast, but is reasonable. The purpose of this array is to enhance space savings when dealing with 4-bit pixmaps.

See Also
make-array
:allocation keyword
Pixmaps


The time macro

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

The time macro now prints the number of static bytes allocated. The number of bytes freed is not printed, thus you cannot use the allocation information to detect static memory leaks.

See Also
Changes to
malloc
and free
The Compiler


Consecutive Errors

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

ACL now prints a message (if it can) after 100 consecutive errors. Version 4.3 caused Lisp to silently exit after 7 consecutive errors.


Handling Printer Errors

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

A new variable, excl::*enclose-printer-errors* controls how to handle errors which occur during printing.

Normal printing follows all of the rules of condition-system handling. If any handled or unhandled condition results in a call to the debugger, a new break level is established, and the user is expected to deal with the low-level printer error (which usually results from a bad print-method or a trashed object).

A user doesn't normally want to debug a bad object or print method, because it is often part of a larger problem which is either more important or is the cause of the bad printing. So, when excl:*enclose-printer-errors* is true, those errors result in a printing of an enclosed object describing the problem. Formerly, the object looked like #<Printer Error>, but now, the object is described including a printing of the condition, for example,

user(1): (format nil "~{abc~:}")
"#<Printer Error, obj=#x3000bc5: Insufficient format args>"
user(2):

excl:*enclose-printer-errors* should always be bound to true whenever objects are being printed, such as in terminal and window output functions like inspectors, debuggers, etc.

excl:*enclose-printer-errors* has a default binding of t. This is a controversial decision, because it could be interpreted as a non-conformance to the ANSI condition handling rules. However, it is set to true by default to protect against unwanted break-level processing in user code, especially when non Allegro CL printing tools are used. If this default is not desired, it can be set to nil.


Miscellaneous

This entry reports a change from 3.0.x on Windows or 4.x on Unix to 5.0 (and thus 5.0.1). There is no new information for 5.0.1.

excl:*daylight-savings-time-observed*
sys:user-name
excl:convert-mixed-case-symbols

Copyright (C) 1998-1999, Franz Inc., Berkeley, CA. All Rights Reserved.