all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* macro temp variables
@ 2014-09-19 10:49 Eric Abrahamsen
  2014-09-19 12:11 ` Nicolas Richard
  0 siblings, 1 reply; 8+ messages in thread
From: Eric Abrahamsen @ 2014-09-19 10:49 UTC (permalink / raw)
  To: help-gnu-emacs

I've never actually needed to write a macro that provided temporary
local variables, and consequently am not very good at it. Despite having
read the docs and basically followed the examples there, my attempt is
producing errors.

The idea with the below is to make a macro that iterates over Org
headlines, and runs the body once for each headline: for each run, a
handful of temporary variables should be bound to various bits of the
headline.

It should be fairly clear from looking at it. "tree" should be bound
once, at the top level of the call. All the other make-symbol variables
should be re-bound with each pass of org-element-map.

I tested this with a little stub call that tried to access the 'todo
symbol, and that gets me "symbol's value as variable is void" for 'todo.
I tried replacing the inner "setq" series with a let*, and got the same
result. Clearly this is just not the way you do it, but I've tried
several different things and nothing works. Am I supposed to be using
nested back-quotes? Can someone tell me how to fix this?

(defmacro org-iter-headings (&rest body)
  (declare (indent 0))
  (let ((tree (make-symbol "tree"))
	(head (make-symbol "head"))
	(item (make-symbol "item"))
	(todo (make-symbol "todo"))
	(tags (make-symbol "tags"))
	(body-pars (make-symbol "body")))
    `(save-restriction
       (org-narrow-to-subtree
	(outline-next-heading) ; Get off the parent heading.
	(let ((,tree (org-element-parse-buffer)))
	  (org-element-map ,tree 'headline
	    (lambda (h)
	      (setq ,head (org-element-at-point)
		    ,item (org-element-property :raw-value ,head)
		    ,todo (cons
			   (org-element-property :todo-type ,head)
			   (org-element-property :todo-keyword ,head))
		    ,tags (org-element-property :tags ,head)
		    ,body-pars (org-element-map ,head 'paragraph 'identity))
	      ,@body)))))))




^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-09-21 20:59 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <mailman.9181.1411123560.1147.help-gnu-emacs@gnu.org>
2014-09-19 17:33 ` macro temp variables Pascal J. Bourguignon
2014-09-19 17:45   ` Stefan Monnier
     [not found]   ` <mailman.9214.1411148764.1147.help-gnu-emacs@gnu.org>
2014-09-19 18:51     ` Pascal J. Bourguignon
2014-09-21  4:37   ` Eric Abrahamsen
     [not found]   ` <mailman.9302.1411299483.1147.help-gnu-emacs@gnu.org>
2014-09-21 20:59     ` Pascal J. Bourguignon
2014-09-19 10:49 Eric Abrahamsen
2014-09-19 12:11 ` Nicolas Richard
2014-09-19 15:48   ` Nicolas Richard

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.