(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
(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)
(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
(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)))))))