/ / guile макро відступи в emacs - emacs, макроси, схема, відступ, guile

Гейбл Макрос відступом в emacs - emacs, macros, schema, indentation, guile

Чи є щось подібне (declare (indent defun)) для guile, таким чином, подібний відступ визначених користувачем макросів defineс?

Наприклад, якщо я пишу наступний макрос,

(define-syntax my-when
(syntax-rules ()
((my-when condition exp ...)
(if condition
(begin exp ...)))))

Тоді я отримую відступ, який виглядає так:

(my-when #t
(write "hi"))

Але воліли б наступне

(my-when #t
(write "hi"))

У elisp, я міг би отримати бажаний відступ через

(defmacro my-when (condition &rest body)
(declare (indent defun))
`(if ,condition
,@body))

(my-when t
(message "hi"))

Примітки щодо версії / режиму: emacs 26, scheme-mode ж / geiser, geiser-impl--implementation = guile

Відповіді:

3 для відповіді № 1

Додайте підказку для відступу для символу:

(put "my-when "scheme-indent-function 1)

Це більш-менш те, що (declare (indent 1)) робить в defmacro.


lisp-mode використовує lisp-indent-line, який шукає lisp-indent-function властивість на символ. Вбудований scheme-mode використовує lisp-indent-function, так що ви думаєте, що це буде працювати так само, як в lisp-mode. Однак ім'я властивості має відповідати імені режиму. Подивитися https://www.gnu.org/software/emacs/manual/html_node/elisp/Indenting-Macros.html#Indenting-Macros за значенням майна.