From: Owen Rodley Date: Fri, 26 Apr 2013 22:03:43 +0000 (+1200) Subject: Only evaluate place in POP once X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=9ae134ee00c94d622163df05439652167e7e3c54;p=jscl.git Only evaluate place in POP once --- diff --git a/src/list.lisp b/src/list.lisp index ddaeb56..0f95f42 100644 --- a/src/list.lisp +++ b/src/list.lisp @@ -56,7 +56,11 @@ (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))))