Make Fare-CSV work with XCVB: don't rely on compile-time side-effects to be preserved.
authorFrancois-Rene Rideau <fare@tunes.org>
Fri, 25 Sep 2009 21:33:45 +0000 (17:33 -0400)
committerFrancois-Rene Rideau <fare@tunes.org>
Fri, 25 Sep 2009 21:33:45 +0000 (17:33 -0400)
build.xcvb [new file with mode: 0644]
csv.lisp
fare-csv.asd
package.lisp

diff --git a/build.xcvb b/build.xcvb
new file mode 100644 (file)
index 0000000..eab3df5
--- /dev/null
@@ -0,0 +1,8 @@
+#+xcvb
+(module
+ (:fullname
+  "fare-csv"
+  :depends-on
+  ("package" "csv")
+  :supersedes-asdf
+  ("fare-csv")))
index c6d12d8..215e70d 100644 (file)
--- a/csv.lisp
+++ b/csv.lisp
@@ -1,6 +1,8 @@
 ;;; -*- Mode: Lisp ; Base: 10 ; Syntax: ANSI-Common-Lisp -*-
 ;;; csv: reading files in Comma-Separated Values format.
 
+#+xcvb (module (:depends-on ("package")))
+
 #| "
 HOME PAGE:
        http://www.cliki.net/fare-csv
@@ -73,19 +75,19 @@ Share and enjoy!
 ; -----------------------------------------------------------------------------
 ;;; Parameters
 
-(eval-when (:compile-toplevel :load-toplevel)
+(eval-when (:compile-toplevel :load-toplevel :execute)
   (defparameter +cr+ #.(format nil "~A" #\Return))
   (defparameter +lf+ #.(format nil "~A" #\Linefeed))
   (defparameter +crlf+ #.(format nil "~A~A" #\Return #\Linefeed))
-  (defparameter *csv-variables* '())
-  (defparameter *csv-rfc4180-values* '())
-  (defparameter *csv-creativyst-values* '())
+  (defparameter *csv-variables* '())) ; list of (var rfc4180-value creativyst-value)
+
+(eval-when (:compile-toplevel :load-toplevel :execute)
   (macrolet
       ((def (var rfc4180 creativyst doc)
-          (push var *csv-variables*)
-          (push creativyst *csv-creativyst-values*)
-          (push rfc4180 *csv-rfc4180-values*)
-          `(defparameter ,var ,creativyst ,doc)))
+         `(progn
+            (eval-when (:compile-toplevel :load-toplevel :execute)
+              (pushnew `(,',var ,,rfc4180 ,,creativyst) *csv-variables* :key #'car))
+            (defparameter ,var ,creativyst ,doc))))
     (def *separator*
        #\, #\,
       "Separator between CSV fields")
@@ -121,19 +123,20 @@ M$, RFC says NIL, csv.3tcl says T")
 (defmacro with-creativyst-csv-syntax (() &body body)
   `(call-with-creativyst-csv-syntax (lambda () ,@body)))
 (defun call-with-creativyst-csv-syntax (thunk)
-  (progv *csv-variables* *csv-creativyst-values*
+  (progv (mapcar #'first *csv-variables*) (mapcar #'third *csv-variables*)
     (funcall thunk)))
 
 (defmacro with-rfc4180-csv-syntax (() &body body)
   `(call-with-rfc4180-csv-syntax (lambda () ,@body)))
 (defun call-with-rfc4180-csv-syntax (thunk)
-  (progv *csv-variables* *csv-rfc4180-values*
+  (progv (mapcar #'first *csv-variables*) (mapcar #'second *csv-variables*)
     (funcall thunk)))
 
 (defmacro with-strict-rfc4180-csv-syntax (() &body body)
   `(call-with-strict-rfc4180-csv-syntax (lambda () ,@body)))
+
 (defun call-with-strict-rfc4180-csv-syntax (thunk)
-  (progv *csv-variables* *csv-rfc4180-values*
+  (with-rfc4180-csv-syntax ()
     (setf *line-endings* (list +crlf+)
          *allow-binary* nil)
     (funcall thunk)))
@@ -153,7 +156,6 @@ M$, RFC says NIL, csv.3tcl says T")
   (assert (and *line-endings* (every #'valid-eol-p *line-endings*)) ())
   (assert (typep *skip-whitespace* 'boolean) ()))
 
-
 ;; For internal use only
 (defvar *accept-cr* t "internal: do we accept cr?")
 (defvar *accept-lf* t "internal: do we accept lf?")
index c5b18b7..79a7d11 100644 (file)
@@ -3,5 +3,6 @@
 
 (asdf:defsystem #:fare-csv
   :depends-on ()
+  :licence "MIT"
   :components ((:file "package") (:file "csv"))
   :serial t)
index 1aace33..3eef1a5 100644 (file)
@@ -1,3 +1,5 @@
+#+xcvb (module (:depends-on nil))
+
 (cl:defpackage #:fare-csv
   (:use #:common-lisp)
   (:export