diff --git a/serialize-lib.lisp b/serialize-lib.lisp index c991c11..2e0863c 100644 --- a/serialize-lib.lisp +++ b/serialize-lib.lisp @@ -15,13 +15,14 @@ (cl-ppcre:regex-replace-all "&[:nr&]" ,seq #',replacef :simple-calls t)))) (defmacro string-to-value (seq table-allow) - (let ((str (gensym)) (datatype (gensym)) (restdata (gensym))) + (let ((str (gensym)) (datatype (gensym)) (restdata (gensym)) (n (gensym))) `(let* ((,str ,seq) (,datatype (char ,str 0)) (,restdata (subseq ,str 1))) (ecase ,datatype (#\T (if ,table-allow 'table (error "table not allowed"))) - (#\N (parse-float ,restdata)) + (#\N (let ((,n (parse-float ,restdata :type 'real))) + (if (typep ,n 'ratio) (coerce ,n 'float) ,n))) (#\B (ecase (parse-integer ,restdata) (0 t) (1 nil))) @@ -46,7 +47,9 @@ (read-table stream restype) vt))) (case restype - (:alist (push (cons kv vv) ht)) + (:alist (let ((c (assoc kv ht :test #'equal))) + (if c (setf (cdr c) vv) + (push (cons kv vv) ht)))) (otherwise (setf (gethash kv ht) vv)))))))) (defun from-stream (stream restype)