Only evaluate place in POP once
authorOwen Rodley <Strigoides@gmail.com>
Fri, 26 Apr 2013 22:03:43 +0000 (10:03 +1200)
committerOwen Rodley <Strigoides@gmail.com>
Fri, 26 Apr 2013 22:03:43 +0000 (10:03 +1200)
src/list.lisp

index ddaeb56..0f95f42 100644 (file)
     (t tree)))
 
 (defmacro pop (place)
-  (let ((car-symbol (gensym)))
-    `(let ((,car-symbol (car ,place)))
-       (setf ,place (cdr ,place))
-       ,car-symbol)))
+  (multiple-value-bind (dummies vals newval setter getter)
+    (get-setf-expansion place)
+    (let ((car-symbol (gensym)))
+      `(let* (,@(mapcar #'list dummies vals) 
+              (,car-symbol (car ,getter))
+              (,(car newval) (cdr ,getter)))
+         ,setter
+         ,car-symbol))))