[cl-store-cvs] CVS update: cl-store/lispworks/custom.lisp

Sean Ross sross at common-lisp.net
Fri Oct 1 08:49:50 UTC 2004


Update of /project/cl-store/cvsroot/cl-store/lispworks
In directory common-lisp.net:/tmp/cvs-serv19698/lispworks

Modified Files:
	custom.lisp 
Log Message:
Changelog 2004-10-01

Date: Fri Oct  1 10:49:47 2004
Author: sross

Index: cl-store/lispworks/custom.lisp
diff -u cl-store/lispworks/custom.lisp:1.1 cl-store/lispworks/custom.lisp:1.2
--- cl-store/lispworks/custom.lisp:1.1	Mon Aug 30 17:10:23 2004
+++ cl-store/lispworks/custom.lisp	Fri Oct  1 10:49:47 2004
@@ -3,7 +3,54 @@
 
 (in-package :cl-store)
 
+;; custom support for infinite floats from Alain Picard.
+(defconstant +positive-infinity+ (expt most-positive-double-float 2))
+(defconstant +negative-infinity+ (expt most-negative-double-float 3))
 
+(defun positive-infinity-p (number)
+  (> number most-positive-double-float))
+
+(defun negative-infinity-p (number)
+  (< number most-negative-double-float))
+
+;; Attempt at fixing broken storing infinity problem
+(defstore-cl-store (obj float stream)
+  (block body
+    (let (significand exponent sign)
+      (handler-bind ((simple-error
+                      #'(lambda (err)
+                          (declare (ignore err))
+                          (cond
+                            ((positive-infinity-p obj)
+                             (output-type-code +positive-infinity-code+ stream)
+                             (return-from body)) ; success
+                            ((negative-infinity-p obj)
+                             (output-type-code +negative-infinity-code+ stream)
+                             (return-from body)) ; success
+                            (t
+                             ;; Unclear what _other_ sort of error we can
+                             ;; get by failing to decode a float, but,
+                             ;; anyway, let the caller handle them...
+                             nil)))))
+        (multiple-value-setq (significand exponent sign)
+          (integer-decode-float obj))
+        (output-type-code +float-code+ stream)
+        (write-byte (float-type obj) stream)
+        (store-object significand stream)
+        (store-object exponent stream)
+        (store-object sign stream)))))
+
+ 
+(defrestore-cl-store (negative-infinity stream)
+  (declare (ignore stream))
+  +negative-infinity+)
+
+(defrestore-cl-store (positive-infinity stream)
+  (declare (ignore stream))
+  +positive-infinity+)
+
+
+;; Custom structure storing from Alain Picard.
 (defstore-cl-store (obj structure-object stream)
   (output-type-code +structure-object-code+ stream)
   (let* ((slot-names (structure:structure-class-slot-names (class-of obj))))





More information about the Cl-store-cvs mailing list