#emacs #macros #elisp
#emacs #макросы #elisp
Вопрос:
Существует ли аналог Elisp для макростеплера SLIME? В частности, я ищу что-то, что расширяет код на этапе следующего расширения (или просто окончательного расширения) в новом буфере.
Наивный
(defun macroexpand-point ()
(interactive)
(let ((b (get-buffer-create "*el-macroexpansion*"))
(expansion (format "%s" (macroexpand (thing-at-point 'sexp)))))
(with-current-buffer b
(insert expansion)
(display-buffer b))))
не делает того, что я ожидаю здесь.
Комментарии:
1. Из любопытства, что именно это делает? Не могу ничего найти по macro-stepper
2. @Dualinity — Он принимает вызов макроса elisp в точке и показывает вам код, до которого он расширяется во временном буфере. Если это все еще не имеет смысла, возможно, вам потребуется ознакомиться с макросами в Lisp .
Ответ №1:
Возможно, вам нужно это:
(defun macroexpand-sexp-at-point ()
(macroexpand (sexp-at-point)))
Вся функция может быть выражена более кратко таким образом
(defun macroexpand-point (sexp)
(interactive (list (sexp-at-point)))
(with-output-to-temp-buffer "*el-macroexpansion*"
(pp (macroexpand sexp)))
(with-current-buffer "*el-macroexpansion*" (emacs-lisp-mode)))
Ответ №2:
Вы можете обнаружить, что imacroexpand.el делает то, что вы хотите.
Ответ №3:
Можно было бы найти пакет macrostep полезным.
Краткое руководство по макрошагу:
После установки пакета и без дальнейшей настройки вы можете сделать это:
Переместите курсор перед выражением, которое вы хотите развернуть, затем сделайте M-x macrostep-expand e e e e e
, чтобы развернуть его шаг за шагом. В области echo отображается короткое справочное сообщение о том, как завершить работу и как развернуть.
Это можно проверить на ->>
примерах макросов со страницы dash.el, которые не слишком просты и не слишком сложны.