# original code in lisp (defparameter *list* ()) (setf *list* (let ((l (list 1 2 3 4)) (result nil)) (loop for i in l do (push #'(lambda () (format t "~d" i)) result)) (nreverse result))) (loop for m in *list* do (funcall m)) # standard macro for hindering leakage (defmacro with-gensyms ((&rest names) &body body) `(let ,(loop for n in names collect `(,n (gensym))) ,@body)) # macro to abstract (defmacro static-loop ((i container) &body body) (with-gensyms (j) `(loop for ,j in ,container do (let ((,i ,j)) ,@body)))) # example (defparameter *list* ()) (setf *list* (let ((l (list 1 2 3 4)) (result nil)) (static-loop (i l) (push #'(lambda () (format t "~d" i)) result)) (nreverse result))) (loop for m in *list* do (funcall m))