Подтвердить что ты не робот

макрос elisp, чтобы написать функцию?

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

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

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

Спасибо!

4b9b3361

Ответ 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 в С# и так далее. Очень кстати.