Шагающий макрос Emacs Lisp

#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, которые не слишком просты и не слишком сложны.