2011-02-13 15 views
5

Estoy tratando de generar funciones utilizando una macro:mapcar elisp + lambda + defmacro ayudan

(defmacro make-my-emacs-command-region (cmd name) 
    (list 'defun (intern (format "my-emacs-command-%s-%s" cmd name)) 
     '(&optional arg) 
     (list 'interactive "p") 
     (list (intern (format "mark-%s" name)) 'arg) 
     (list (intern (format "my-emacs-command-%s-region" cmd)) 
       '(region-beginning) '(region-end)))) 

generador:

(mapcar (lambda (a) (make-my-emacs-command-region a buffer)) 
     '(foo bar)) 

Pero consigo:

my-emacs-command-a-buffer 

¿Qué soy yo haciendo mal? ¿Cómo puedo obligar a pasar el valor de a?

Respuesta

4

Mi elisp es un poco oxidado, pero hasta que alguien se le ocurre la explicación real: podía obtener sus ejemplos para trabajar un poco más como se esperaba mi reemplazando cmd con (eval cmd) (posiblemente mismo con name) en el cuerpo definición de la macro.

Espero que esto ayude.

7

Un punto importante de macros Lisp es que los argumentos son no evaluados. Lea en el macro pages in the manual, específicamente el expansion of macros. La función macroexpand sería útil para depurar el problema. Además, backquote podría ayudarlo a escribir el cuerpo de la macro de forma un poco más sucinta.