elisp mapcar + lambda + defmacro help - PullRequest
       25

elisp mapcar + lambda + defmacro help

5 голосов
/ 13 февраля 2011

Я пытаюсь сгенерировать функции, используя макрос:

(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))))

генератор:

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

Но я получаю:

my-emacs-command-a-buffer

Что я делаюнеправильно?Как я могу заставить передать значение a?

Ответы [ 2 ]

7 голосов
/ 13 февраля 2011

Основным моментом макросов lisp является то, что аргументы не оценены.Читайте о страницах макросов в руководстве , в частности о расширении макросов .Функция macroexpand будет полезна при отладке проблемы.Кроме того, обратная цитата может помочь вам написать тело макроса более кратко.

4 голосов
/ 13 февраля 2011

Мой elisp немного заржавел, но пока кто-то не придет к реальному объяснению: я мог бы заставить ваши примеры работать немного больше, чем ожидалось, заменив cmd на (eval cmd) (возможно, то же самое с name) в тело определения макроса.

Надеюсь, это поможет.

...