Макрос elisp, чтобы написать функцию?
Я написал несколько почти идентичных функций, за исключением их названий. Например:
; x is name, such as function/paragraph/line/etc.
(defun my-x-function
(interactive)
(mark-x) (do-more-stuff) (modify-x))
Есть ли способ автоматически генерировать такие функции? У меня есть ощущение, что это то, что делают макросы, но я не уверен, как их использовать. Любая помощь, может быть, в том числе небольшой пример, было бы здорово.
Спасибо!
2 ответа
Да, это именно то, что делают макросы. Вот простой макрос, который строит функции в соответствии с указанным вами шаблоном:
(defmacro make-my-function (name)
(list 'defun (intern (format "my-%s-function" name)) ()
(list 'interactive)
(list (intern (format "mark-%s" name)))
(list 'do-more-stuff)
(list (intern (format "modify-%s" name)))))
Вы можете скопировать этот макрос в *scratch*
создайте буфер в Emacs и оцените его, а затем убедитесь, что он работает следующим образом:
(make-my-function x) ; type control-J here
my-x-function ; <-- Emacs's output
(symbol-function 'my-x-function) ; type control-J here
(lambda nil (interactive) (mark-x) (do-more-stuff) (modify-x)) ; <-- Emacs's output
Чаще всего можно использовать средство обратной цитаты для написания макросов более кратко, но все макросы по существу работают так же, как и в приведенном выше примере.
Макросы могут сделать это, но есть много шаблонных модулей для emacs, чтобы сделать подобную работу. Я использую штуку под названием yasnippet.el для быстрой генерации кода. Например, в исходном C-файле, если я наберу for<TAB>
Я получаю шаблон цикла; это позволяет мне заполнять шаблон, устанавливая имя переменной, пределы и содержимое внутреннего цикла.
выглядит так:
http://i39.tinypic.com/o8tbmq.jpg
Вы можете настроить шаблоны для чего угодно. Определения функций, операторы if, операторы switch, что угодно. Установите разные шаблоны для разных режимов. Шаблон для for
цикл в C отличается от шаблона для for
цикл в C# и так далее. Очень кстати.