Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defmacro save-place ((place &optional new) &body body &environment env)
- (multiple-value-bind (vars vals store-vars writer-form reader-form) (get-setf-expansion place env)
- (when (cdr store-vars) (error "Can't expand this place ~S" place))
- (let ((name (gensym)))
- `(let* (,@(mapcar (function list) vars vals)
- (,(car store-vars) ,reader-form))
- (let ((,name (or ,new ,(car store-vars))))
- (unwind-protect (progn ,@body)
- (setf ,(car store-vars) ,name)
- ,writer-form))))))
- (let ((k (vector (cons 42 33)
- (cons 0 0)
- (cons 1 1)))
- (i -1))
- (block out
- (save-place ((car (aref k (incf i))))
- (dotimes (j (length k))
- (setf (car (aref k j)) -1
- (cdr (aref k j)) -1))
- (return-from out 'hi)))
- (assert (= 42 (car (aref k 0))))
- k)
- ; --> #((42 . -1) (-1 . -1) (-1 . -1))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement