guile 是否有类似 (declare (indent defun)) 的东西,所以用户定义的宏的缩进就像 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 w/geiser , geiser-impl--implementation = guile

最佳答案

为符号添加缩进提示:

(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

关于emacs - emacs 中的 guile 宏缩进,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43959836/

10-14 16:41