From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Maus Subject: [PATCH 0/8] Org mode macros, refactored Date: Tue, 2 Aug 2011 11:23:33 +0200 Message-ID: <1312277020-7888-1-git-send-email-dmaus@ictsoc.de> Return-path: Received: from eggs.gnu.org ([140.186.70.92]:53237) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QoBCi-0007vr-2h for emacs-orgmode@gnu.org; Tue, 02 Aug 2011 05:24:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QoBCg-0000Es-SJ for emacs-orgmode@gnu.org; Tue, 02 Aug 2011 05:24:00 -0400 Received: from app1b.xlhost.de ([213.202.242.162]:59876) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QoBCg-0000DS-Mh for emacs-orgmode@gnu.org; Tue, 02 Aug 2011 05:23:58 -0400 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org Cc: David Maus Following series of patches is product of some refactoring of macro-usage in Org mode. It defines two new macros and applies those macros in other macros in org-macs and batch-agenda functions. Comments are welcome. I'll create a bundle for the patches in patchwork. If there are no objections I would like to push these changes at the end of the week. Maybe the most conveniant macro for further development is (org-with-uninterend SYMBOLS BODY) This macro wraps BODY in a let binding form where each symbol in SYMBOLS is bound to a new but uninterned symbol of the same name. This way you can avoid leaking or, more precisely, capturing of symbols if you write a macro that needs to bind its own control variables in the macro expansion form. E.g. (defmacro org-preserve-lc (&rest body) `(let ((line (org-current-line)) (col (current-column))) (unwind-protect (progn ,@body) (org-goto-line line) (org-move-to-column col)))) The let binding at the top of the expansion form shadows symbols with the name line and cols if they are bound before BODY, and if BODY uses symbols with the same name it would overwrite the symbols bound in the let form. Org-with-uninterned prevents this by creating new uninterned symbols which are unreachable outside the expanded form and inside BODY. (defmacro org-preserve-lc (&rest body) (org-with-uninterned (line col) `(let ((,line (org-current-line)) (,col (current-column))) (unwind-protect (progn ,@body) (org-goto-line ,line) (org-move-to-column ,col))))) Expands to: (let ((line (make-symbol (symbol-name 'line))) (col (make-symbol (symbol-name 'col)))) `(let ((,line (org-current-line)) (,col (current-column))) (unwind-protect (progn ,@body) (org-goto-line ,line) (org-move-to-column ,col)))) This way ,line and ,col in the macro expansion refer to the new uninterned symbols line and col created outside the expansion form. Note: The usage of make-symbol works but has one drawback: The new uninterned symbols have the same name as the maybe interned symbols in BODY. Ideally we should use `gensym' instead, which creates a new uninterned symbol with a unique name. But gensym is part of the cl-package and thus not allowed to be called at runtime for a program to be part of Emacs core. David Maus (8): New macro: Execute BODY in enviroment with uninterned SYMBOLS. Use new macro org-with-uninterned New macro: Evaluate BODY in ENVIRONMENT New function: Substitute posix classes in regular expression Use macro org-with-uninterned New function: Turn a flat parameter list into an alist Use org-eval-in-environment, make macros functions Make org-batch-store-agenda-views a fun, use org-eval-in-environment lisp/org-agenda.el | 92 ++++++++++++++++------------------- lisp/org-macs.el | 137 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 123 insertions(+), 106 deletions(-) -- 1.7.2.5