comparison 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
comparison
equal deleted inserted replaced
5561:9a93bc90b3bd 5562:855b667dea13
607 (lambda (x) 607 (lambda (x)
608 (list 'list '(quote quote) x))) 608 (list 'list '(quote quote) x)))
609 cl-closure-vars) 609 cl-closure-vars)
610 '((quote --cl-rest--))))))) 610 '((quote --cl-rest--)))))))
611 (list (car form) (list* 'lambda (cadadr form) body)))) 611 (list (car form) (list* 'lambda (cadadr form) body))))
612 (let ((found (assq (cadr form) env))) 612 ;; This is a bit of a hack; special-case symbols with bindings as
613 ;; XEmacs: cadr/caddr operate on nil without errors. But the 613 ;; labels.
614 ;; macro definition may be compiled, in which case there's 614 (let ((found (cdr (assq (cadr form) env))))
615 ;; nothing for us to do. 615 (if (and (consp found) (eq (nth 1 (nth 1 found)) 'cl-labels-args))
616 (if (and (listp (cdr found)) 616 (if (consp (nth 2 (nth 2 found)))
617 (eq (cadr (caddr found)) 'cl-labels-args)) 617 ;; It's a cons; this is the implementation of
618 (cl-macroexpand-all (cadr (caddr (cadddr found))) env) 618 ;; labels in cl-macs.el.
619 (cl-macroexpand-all (nth 1 (nth 2 (nth 2 found))) env)
620 ;; It's an atom, almost certainly a compiled function;
621 ;; we're using the implementation of labels in
622 ;; bytecomp.el.
623 (nth 2 (nth 2 found)))
619 form)))) 624 form))))
620 ((memq (car form) '(defun defmacro)) 625 ((memq (car form) '(defun defmacro))
621 (list* (car form) (nth 1 form) (cl-macroexpand-body (cddr form) env))) 626 (list* (car form) (nth 1 form) (cl-macroexpand-body (cddr form) env)))
622 ((and (eq (car form) 'progn) (not (cddr form))) 627 ((and (eq (car form) 'progn) (not (cddr form)))
623 (cl-macroexpand-all (nth 1 form) env)) 628 (cl-macroexpand-all (nth 1 form) env))