[Openmcl-devel] two portability issues
Rainer Joswig
joswig at lisp.de
Sat Dec 20 09:53:40 PST 2014
Hi,
I just looked a small benchmark someone wrote and tried to improve it.
The result is here:
https://gist.github.com/lispm/6066e1eeadf943910c47 <https://gist.github.com/lispm/6066e1eeadf943910c47>
The corresponding data file is here:
https://raw.githubusercontent.com/logicchains/LPATHBench/master/agraph
There were two issues I saw with CCL:
** first issue: DEFSTRUCT defined type at compile time unknown? **
There is a structure declaration ROUTE via a DEFSTRUCT.
I wanted to use the type ROUTE in a LOOP later in the function
(defun get-longest-path (nodes node-id visited &aux (max 0))
(declare (optimize (speed 3) (space 0) (debug 0) (safety 0) (compilation-speed 0)
#+lispworks (fixnum-safety 0))
(fixnum max))
(setf (svref visited node-id) t)
(setf max (loop for neighbour of-type route in (svref nodes node-id) ; <— declaration
unless (svref visited (route-dest neighbour))
maximize (+ (the fixnum (route-cost neighbour))
(the fixnum (get-longest-path nodes
(route-dest neighbour)
visited)))
#+lispworks fixnum))
(setf (svref visited node-id) nil)
max)
The CCL compiler did not know about the type ROUTE, so I had to use EVAL-WHEN around the structure definition. Shouldn’t the compiler recognize the type at compile time? The ANSI CL documentation for DEFSTRUCT indicates that…
** second issue: LOOP clause MAXIMIZE**
in above function there is a clause MAXIMIZE … FIXNUM .
In CCL (and several other implementations, with the exception of LispWorks) this causes that a wrong result (a negative number) is computed. Without the FIXNUM declaration the result is correct.
Regards,
Rainer Joswig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.clozure.com/pipermail/openmcl-devel/attachments/20141220/fb8cdc6c/attachment.htm>
More information about the Openmcl-devel
mailing list