макрос elisp для записи функции?

Я записал несколько почти идентичных функций, за исключением их имен. Например:

; x is name, such as function/paragraph/line/etc.
(defun my-x-function
 (interactive)
 (mark-x) (do-more-stuff) (modify-x))

Существует ли способ автоматически генерировать такие функции? У меня есть чувство, что это - то, какие макросы делают, но я не уверен, как использовать их. Любая справка, возможно, включая небольшой пример была бы большой.

Спасибо!

17
задан user1404316 31 August 2018 в 17:25
поделиться

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

Чаще можно использовать функцию обратных кавычек для более лаконичного написания макросов, но все макросы по существу работают так же, как в приведенном выше примере.

21
ответ дан 30 November 2019 в 13:20
поделиться

Макросы могут это делать, но есть множество модулей шаблонов для emacs, которые выполняют аналогичную работу. Я использую вещь под названием yasnippet.el для быстрого создания кода. Например, в исходном файле на языке C, если я наберу для , я получу шаблон цикла for; он позволяет мне заполнить шаблон, задав имя переменной, пределы и содержимое внутреннего цикла.

выглядит так:

alt text

Вы можете создавать шаблоны для чего угодно. Определения функций, операторы if, операторы переключения, что угодно. Настройте разные шаблоны для разных режимов. Шаблон для цикла for в C отличается от шаблона для цикла for в C # и так далее. Очень кстати.

3
ответ дан 30 November 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: