From cdf9ab0e8107d306244a3c10ee02b10ce4d8c629 Mon Sep 17 00:00:00 2001 From: Vladimir Sedach Date: Fri, 3 Aug 2007 21:59:17 +0000 Subject: [PATCH] Stopped abuse of set-difference implementation-dependent ordering in defsetf. --- src/ps-macrology.lisp | 4 ++-- src/utils.lisp | 6 +++++- t/ps-tests.lisp | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ps-macrology.lisp b/src/ps-macrology.lisp index c77f485..c55ea88 100644 --- a/src/ps-macrology.lisp +++ b/src/ps-macrology.lisp @@ -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) diff --git a/src/utils.lisp b/src/utils.lisp index bbcec9a..ed78b81 100644 --- a/src/utils.lisp +++ b/src/utils.lisp @@ -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 diff --git a/t/ps-tests.lisp b/t/ps-tests.lisp index 9d4f801..a2328a0 100644 --- a/t/ps-tests.lisp +++ b/t/ps-tests.lisp @@ -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))))))) -- 2.20.1