/ / guile wcięcie makro w emacs - emacs, makra, schemat, wcięcia, podstęp

guile macro wcięcia w emacs - emacs, makra, schemat, wcięcie, podstęp

Czy jest coś takiego (declare (indent defun)) dla podstępu, więc wcięcia makr zdefiniowanych przez użytkownika działają podobnie defines?

Na przykład, jeśli napiszę następujące makro,

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

Wtedy dostaję wcięcia, które wyglądają jak

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

Ale wolałbym, co następuje

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

W elisp mogłem uzyskać żądane wcięcie

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

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

Uwagi do wersji / trybu: emacs 26, scheme-mode w / geiser, geiser-impl--implementation = guile

Odpowiedzi:

3 dla odpowiedzi № 1

Dodaj wskazówkę do wcięcia dla symbolu:

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

To jest mniej więcej co (declare (indent 1)) wchodzi w defmacro.


lisp-mode używa lisp-indent-line, który szuka lisp-indent-function właściwość na symbolu. Wbudowany scheme-mode używa lisp-indent-function, więc pomyślałbyś, że to działa tak jak w lisp-mode. Jednak nazwa właściwości musi być zgodna z nazwą trybu. Widzieć https://www.gnu.org/software/emacs/manual/html_node/elisp/Indenting-Macros.html#Indenting-Macros dla wartości nieruchomości.