[alexandria-devel] [PATCH] PROG1-LET

Tamas K Papp tkpapp at gmail.com
Sun Apr 8 10:33:55 UTC 2012


On Sat 07 Apr 2012 10:25:00 PM CEST, Benjamin Saunders wrote:

> PROG1-LET is a binding macro modeled closely after WHEN-LET and
> friends, which I have regularly found useful in code to implement the
> "create, modify, return" pattern common in some imperative
> code. As a simple and, I believe, widely useful macro, I'd like to see
> this enter into Alexandria proper. Docstring follows:

I usually use something like

(aprog1 (cons 'initially 0)
  (incf (cdr it)))

to implement this pattern using the ANAPHORA library.  Your macro would
of course be a better solution if, for some reason, one doesn't want to
use an anaphoric macro, but IMO it would be cleaner to just handle a
single form, eg

(defmacro prog1-let ((variable initial-form) &body body)
  `(let ((,variable ,initial-form))
     (prog1 ,variable
       , at body)))

because the first form is special anyway.  A multiple-value extension
that returns all values in the let form would be interesting:

(defmacro prog1-values-let (bindings &body body)
  ;; could be named better?
  `(let ,bindings
     (multiple-value-prog1 (values ,@(mapcar (compose #'car #'ensure-list)
                                             bindings))
       , at body)))

(prog1-values-let ((mycons (cons 'initially 0))
                   (mynum 9))
  (incf (cdr mycons))
  (decf mynum))

      => (initially . 1), 9

And similarly with LET*.

Best,

Tamas




More information about the alexandria-devel mailing list