X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/lisp/blobdiff_plain/4b53d23cef3d56dfa5c87bc290db159bec74baf9..4da88bb98b75edf5033fa864cae0d3d1c397ac07:/mdw-base.lisp diff --git a/mdw-base.lisp b/mdw-base.lisp index 95b79de..df2acd3 100644 --- a/mdw-base.lisp +++ b/mdw-base.lisp @@ -195,7 +195,7 @@ (defun fixnump (object) (defmacro with-gensyms (syms &body body) "Everyone's favourite macro helper." `(let (,@(mapcar (lambda (sym) `(,sym (gensym ,(symbol-name sym)))) - (listify syms))) + (listify syms))) ,@body)) (defmacro let*/gensyms (binds &body body) @@ -204,16 +204,16 @@ (defmacro let*/gensyms (binds &body body) each VAR is bound to a gensym, and in the final expansion, each of those gensyms will be bound to the corresponding VALUE." (labels ((more (binds) - (let ((tmp (gensym "TMP")) (bind (car binds))) - `((let ((,tmp ,(cadr bind)) - (,(car bind) (gensym ,(symbol-name (car bind))))) - `(let ((,,(car bind) ,,tmp)) - ,,@(if (cdr binds) - (more (cdr binds)) - body))))))) + (let ((tmp (gensym "TMP")) (bind (car binds))) + `((let ((,tmp ,(cadr bind)) + (,(car bind) (gensym ,(symbol-name (car bind))))) + `(let ((,,(car bind) ,,tmp)) + ,,@(if (cdr binds) + (more (cdr binds)) + body))))))) (if (null binds) - `(progn ,@body) - (car (more (mapcar #'pairify (listify binds))))))) + `(progn ,@body) + (car (more (mapcar #'pairify (listify binds))))))) ;;;-------------------------------------------------------------------------- ;;; Some simple yet useful control structures. @@ -227,7 +227,7 @@ (defmacro nlet (name binds &body body) collect val into vals finally (return (values vars vals))) `(labels ((,name ,vars - ,@body)) + ,@body)) (,name ,@vals)))) (defmacro while (cond &body body) @@ -253,7 +253,7 @@ (compile-time-defun do-case2-like (kind vform clauses) (list `(let ((,(or vary varx) ,argument) ,@(and vary `((,varx ,scrutinee)))) - ,@forms)) + ,@forms)) forms)))) clauses))))) @@ -318,29 +318,29 @@ (defmacro with-places ((&key environment) places &body body) (if (null places) `(progn ,@body) (let*/gensyms (environment) - (labels - ((more (places) - (let ((place (car places))) - (with-gensyms (tmp valtmps valforms - newtmps setform getform) - `((let ((,tmp ,(cadr place)) - (,(car place) - (gensym ,(symbol-name (car place))))) - (multiple-value-bind - (,valtmps ,valforms - ,newtmps ,setform ,getform) - (get-setf-expansion ,tmp - ,environment) - (list 'let* - (mapcar #'list ,valtmps ,valforms) - `(symbol-macrolet ((,,(car place) - (%place-ref ,,getform - ,,setform - ,,newtmps))) - ,,@(if (cdr places) - (more (cdr places)) - body)))))))))) - (car (more (mapcar #'pairify (listify places)))))))) + (labels + ((more (places) + (let ((place (car places))) + (with-gensyms (tmp valtmps valforms + newtmps setform getform) + `((let ((,tmp ,(cadr place)) + (,(car place) + (gensym ,(symbol-name (car place))))) + (multiple-value-bind + (,valtmps ,valforms + ,newtmps ,setform ,getform) + (get-setf-expansion ,tmp + ,environment) + (list 'let* + (mapcar #'list ,valtmps ,valforms) + `(symbol-macrolet ((,,(car place) + (%place-ref ,,getform + ,,setform + ,,newtmps))) + ,,@(if (cdr places) + (more (cdr places)) + body)))))))))) + (car (more (mapcar #'pairify (listify places)))))))) ;;;-------------------------------------------------------------------------- ;;; Update-in-place macros built using with-places. @@ -385,7 +385,7 @@ (defmacro locf (place &environment env) (get-setf-expansion place env) `(let* (,@(mapcar #'list valtmps valforms)) (make-loc (lambda () ,getform) - (lambda (,@newtmps) ,setform))))) + (lambda (,@newtmps) ,setform))))) (declaim (inline loc (setf loc)))