макрос elisp, чтобы написать функцию?
Я написал несколько почти идентичных функций, за исключением их названий. Например:
; x is name, such as function/paragraph/line/etc.
(defun my-x-function
(interactive)
(mark-x) (do-more-stuff) (modify-x))
Есть ли способ автоматически генерировать такие функции? У меня такое ощущение, что это то, что делают макросы, но я не уверен, как их использовать. Любая помощь, может быть, в том числе небольшой пример, было бы здорово.
Спасибо!
Ответы
Ответ 1
Да, именно то, что делают макросы. Вот простой макрос, который строит функции в соответствии с указанным вами шаблоном:
(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 output
(symbol-function 'my-x-function) ; type control-J here
(lambda nil (interactive) (mark-x) (do-more-stuff) (modify-x)) ; <-- Emacs output
Более часто можно использовать средство backquote для более быстрого написания макросов, но все макросы работают по-разному, как указано выше пример.
Ответ 2
Макросы могут сделать это, но есть много шаблонных модулей для emacs, чтобы сделать подобную работу. Я использую вещь под названием yasnippet.el для быстрой генерации кода. Например, в файле с исходным кодом на C, если я наберу for<TAB>
, я получу шаблон цикла for; это позволяет мне заполнить шаблон, задав имя переменной, пределы и содержимое внутреннего цикла.
выглядит так:
![alt text]()
Вы можете настроить шаблоны для чего угодно. Определения функций, операторы if, операторы switch, что угодно. Установите разные шаблоны для разных режимов. Шаблон для цикла for
в C отличается от шаблона for
цикла for
в С# и так далее. Очень кстати.