diff lisp/cl-extra.el @ 5562:855b667dea13

Drop cl-macro-environment in favour of byte-compile-macro-environment. lisp/ChangeLog addition: 2011-09-04 Aidan Kehoe <kehoea@parhasard.net> * bytecomp-runtime.el: * bytecomp-runtime.el (byte-compile-macro-environment): Moved from bytecomp.el. * bytecomp.el: * bytecomp.el (byte-compile-initial-macro-environment): Add implementations for #'load-time-value, #'labels here, now cl-macs respects byte-compile-macro-environment. * bytecomp.el (byte-compile-function-environment): * bytecomp.el (byte-compile-macro-environment): Removed. * bytecomp.el (symbol-value): * bytecomp.el (byte-compile-symbol-value): Removed. * cl-extra.el (cl-macroexpand-all): * cl-macs.el: * cl-macs.el (bind-block): * cl-macs.el (cl-macro-environment): Removed. * cl-macs.el (cl-transform-lambda): * cl-macs.el (load-time-value): * cl-macs.el (block): * cl-macs.el (flet): * cl-macs.el (labels): * cl-macs.el (macrolet): * cl-macs.el (symbol-macrolet): * cl-macs.el (lexical-let): * cl-macs.el (apply): * cl-macs.el (nthcdr): * cl-macs.el (getf): * cl-macs.el (substring): * cl-macs.el (values): * cl-macs.el (get-setf-method): * cl-macs.el (cl-setf-do-modify): * cl.el: * cl.el (cl-macro-environment): Removed. * cl.el (cl-macroexpand): * obsolete.el (cl-macro-environment): Moved here. Drop cl-macro-environment, in favour of byte-compile-macro-environment; make the latter available in bytecomp-runtime.el. This makes byte-compile-macro-environment far less useless, since previously code that used cl-macs would ignore it when calling #'cl-macroexpand-all. Add byte-compiler-specific implementations for #'load-time-value, #'labels. The latter is very nice indeed; it avoids the run-time consing of the current implementation, is fully lexical and avoids the run-time shadowing of symbol function slots that flet uses. It would now be reasonable to move most core uses of flet to use labels instead. Non-core code can't rely on print-circle for mutually recursive functions, though, so it's less of an evident win.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 04 Sep 2011 20:37:55 +0100
parents f2881cb841b4
children d4f334808463
line wrap: on
line diff
--- a/lisp/cl-extra.el	Sun Sep 04 20:35:31 2011 +0100
+++ b/lisp/cl-extra.el	Sun Sep 04 20:37:55 2011 +0100
@@ -609,13 +609,18 @@
 					     cl-closure-vars)
 				     '((quote --cl-rest--)))))))
 		 (list (car form) (list* 'lambda (cadadr form) body))))
-	   (let ((found (assq (cadr form) env)))
-	     ;; XEmacs: cadr/caddr operate on nil without errors. But the
-	     ;; macro definition may be compiled, in which case there's
-	     ;; nothing for us to do.
-	     (if (and (listp (cdr found))
-		      (eq (cadr (caddr found)) 'cl-labels-args))
-		 (cl-macroexpand-all (cadr (caddr (cadddr found))) env)
+           ;; This is a bit of a hack; special-case symbols with bindings as
+           ;; labels.
+	   (let ((found (cdr (assq (cadr form) env))))
+	     (if (and (consp found) (eq (nth 1 (nth 1 found)) 'cl-labels-args))
+                 (if (consp (nth 2 (nth 2 found)))
+                     ;; It's a cons; this is the implementation of
+                     ;; labels in cl-macs.el.
+                     (cl-macroexpand-all (nth 1 (nth 2 (nth 2 found))) env)
+                   ;; It's an atom, almost certainly a compiled function;
+                   ;; we're using the implementation of labels in
+                   ;; bytecomp.el.
+                  (nth 2 (nth 2 found)))
 	       form))))
 	((memq (car form) '(defun defmacro))
 	 (list* (car form) (nth 1 form) (cl-macroexpand-body (cddr form) env)))