Mild macro optimizations
authorKevin Rosenberg <kevin@rosenberg.net>
Sat, 24 Apr 2010 23:42:02 +0000 (17:42 -0600)
committerKevin Rosenberg <kevin@rosenberg.net>
Sat, 24 Apr 2010 23:42:02 +0000 (17:42 -0600)
macros.lisp

index cc39ad41b871947c57f85f3edfde6aa983463c4b..bf47c63bb005f95e00fbe86f043e37aa296658c9 100644 (file)
                (let ((it ,val)) ,@(cdr cl1))
                (acond2 ,@(cdr clauses)))))))
 
-(defmacro mac (expr)
-"Expand a macro"
-  `(pprint (macroexpand-1 ',expr)))
+(defmacro mac (form &key (stream *standard-output*) (full nil) (width 80)
+               (downcase t)
+               &environment env)
+  (multiple-value-bind (expanded expanded-p)
+      (funcall (if full #'macroexpand #'macroexpand-1) form env)
+    (write expanded
+           :stream stream
+           :pretty t
+           :right-margin width
+           :case (if downcase :downcase :upcase)
+           :length nil
+           :level nil
+           :circle nil
+           :gensym nil)
+    (fresh-line stream)
+    expanded-p))
 
 (defmacro print-form-and-results (form)
-  `(format t "~&~A --> ~S~%" (write-to-string ',form) ,form))
-
+  (let ((r (gensym "RES-")))
+    `(let ((r ,form))
+       (format t "~&~A --> ~S~%" ',form r)
+       r)))
 
 ;;; Loop macros
 
      ,@body))
 
 (defmacro for ((var start stop) &body body)
-  (let ((gstop (gensym)))
+  (let ((gstop (gensym "STOP-")))
     `(do ((,var ,start (1+ ,var))
           (,gstop ,stop))
          ((> ,var ,gstop))
        ,@body)))
 
 (defmacro with-each-stream-line ((var stream) &body body)
-  (let ((eof (gensym))
-        (eof-value (gensym))
-        (strm (gensym)))
+  (let ((eof (gensym "EOF-"))
+        (eof-value (gensym "EOF-VALUE-"))
+        (strm (gensym "STREAM-")))
     `(let ((,strm ,stream)
            (,eof ',eof-value))
       (do ((,var (read-line ,strm nil ,eof) (read-line ,strm nil ,eof)))