Stopped abuse of set-difference implementation-dependent ordering in defsetf.
authorVladimir Sedach <vsedach@gmail.com>
Fri, 3 Aug 2007 21:59:17 +0000 (21:59 +0000)
committerVladimir Sedach <vsedach@gmail.com>
Fri, 3 Aug 2007 21:59:17 +0000 (21:59 +0000)
src/ps-macrology.lisp
src/utils.lisp
t/ps-tests.lisp

index c77f485..c55ea88 100644 (file)
@@ -378,7 +378,7 @@ lambda-list::=
 (defpsmacro defsetf-long (access-fn lambda-list (store-var) form)
   (setf (find-macro-spec access-fn *script-setf-expanders*)
         (compile nil
-                 (let ((var-bindings (set-difference lambda-list lambda-list-keywords)))
+                 (let ((var-bindings (ordered-set-difference lambda-list lambda-list-keywords)))
                    `(lambda (access-fn-args store-form)
                      (destructuring-bind ,lambda-list
                                access-fn-args
@@ -387,7 +387,7 @@ lambda-list::=
                               (gensymed-arg-bindings (mapcar #'list gensymed-names (list ,@var-bindings))))
                          (destructuring-bind ,var-bindings
                              gensymed-names
-                           `(let (,@(reverse gensymed-arg-bindings)
+                           `(let (,@gensymed-arg-bindings
                                   (,,store-var ,store-form))
                              ,,form))))))))
   nil)
index bbcec9a..ed78b81 100644 (file)
@@ -141,4 +141,8 @@ For example, paren-script becomes parenScript, *some-global* becomes SOMEGLOBAL.
            (reduce #'funcall fns 
                    :from-end t
                    :initial-value (apply fn1 args))))
-      #'identity))
\ No newline at end of file
+      #'identity))
+
+(defun ordered-set-difference (list1 list2 &key (test #'eql))
+  (reduce (lambda (list el) (remove el list :test test))
+          (cons list1 list2)))
\ No newline at end of file
index 9d4f801..a2328a0 100644 (file)
@@ -238,7 +238,7 @@ x = 2 + sideEffect() + x + 5;")
 
 (test defsetf1
   (ps (defsetf baz (x y) (newval) `(set-baz ,x ,y ,newval)))
-  (is (string= "var PS_GS_3 = 1; var PS_GS_2 = 2; var PS_GS_1 = 3; setBaz(PS_GS_3, PS_GS_2, PS_GS_1);"
+  (is (string= "var PS_GS_2 = 1; var PS_GS_3 = 2; var PS_GS_1 = 3; setBaz(PS_GS_2, PS_GS_3, PS_GS_1);"
                (normalize-js-code (let ((ps::*gen-script-name-counter* 0))
                                     (ps (setf (baz 1 2) 3)))))))