From: Katsumi Yamaoka Date: Tue, 4 Dec 2012 23:23:55 +0000 (+0000) Subject: gmm-utils.el (gmm-labels): Use cl-labels if available X-Git-Url: http://cgit.sxemacs.org/?p=gnus;a=commitdiff_plain;h=1dd17bf9b604184bffb73cceb9e3892b323efd52 gmm-utils.el (gmm-labels): Use cl-labels if available --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b88504a4c..d9d29e623 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2012-12-04 Katsumi Yamaoka + + * gmm-utils.el (gmm-labels): Use cl-labels if available. + 2012-12-04 Katsumi Yamaoka * gmm-utils.el (gmm-flet, gmm-labels): New macros. diff --git a/lisp/gmm-utils.el b/lisp/gmm-utils.el index 3d504d73c..9be6c66b6 100644 --- a/lisp/gmm-utils.el +++ b/lisp/gmm-utils.el @@ -435,46 +435,14 @@ coding-system." (fmakunbound (car orig))))))) (put 'gmm-flet 'lisp-indent-function 1) -;; An alist of original function names and those unique names. -(defvar gmm-labels-environment) - -(defun gmm-labels-expand (form) - "Expand funcalls in FORM according to `gmm-labels-environment'. -This function is a subroutine that `gmm-labels' uses to convert any -`(FN ...)' and #'FN elements in FORM into `(funcall UN ...)' and `UN' -respectively if `(FN . UN)' is listed in `gmm-labels-environment'." - (cond ((or (not (consp form)) (memq (car form) '(\` backquote quote))) - form) - ((assq (car form) gmm-labels-environment) - `(funcall ,(cdr (assq (car form) gmm-labels-environment)) - ,@(mapcar #'gmm-labels-expand (cdr form)))) - ((eq (car form) 'function) - (if (and (assq (cadr form) gmm-labels-environment) - (not (cddr form))) - (cdr (assq (cadr form) gmm-labels-environment)) - (cons 'function (mapcar #'gmm-labels-expand (cdr form))))) - (t - (mapcar #'gmm-labels-expand form)))) - (defmacro gmm-labels (bindings &rest body) "Make temporary function bindings. The lexical scoping is handled via `lexical-let' rather than relying on `lexical-binding'. \(fn ((FUNC ARGLIST BODY...) ...) FORM...)" - (let (gmm-labels-environment def defs) - (dolist (binding bindings) - (push (cons (car binding) - (make-symbol (format "--gmm-%s--" (car binding)))) - gmm-labels-environment)) - `(lexical-let ,(mapcar #'cdr gmm-labels-environment) - (setq ,@(dolist (env gmm-labels-environment (nreverse defs)) - (setq def (cdr (assq (car env) bindings))) - (push (cdr env) defs) - (push `(lambda ,(car def) - ,@(mapcar #'gmm-labels-expand (cdr def))) - defs))) - ,@(mapcar #'gmm-labels-expand body)))) + `(,(progn (require 'cl) (if (fboundp 'cl-labels) 'cl-labels 'labels)) + ,bindings ,@body)) (put 'gmm-labels 'lisp-indent-function 1) (provide 'gmm-utils)