2

为我定义的 Emacs Lisp 宏指定缩进样式的两种流行方式之间有什么区别或优缺点?

声明方式:

(defmacro my-dotimes-1 (num &rest body)
  (declare (indent 1))  ; <---
  `(let ((it 0))
     (while (< it ,num)
       ,@body
       (setq it (1+ it)))))

放置方式:

(defmacro my-dotimes-2 (num &rest body)
  `(let ((it 0))
     (while (< it ,num)
       ,@body
       (setq it (1+ it)))))
(put 'my-dotimes-2 'lisp-indent-function 1) ; <---

(该名称it不是 gensym,因为该示例是从作为照应宏的宏复制而来的。--dotimesdash.el

4

3 回答 3

3

我知道的唯一区别是declare它只适用于 Emacs Lisp,而该put方法也适用于其他语言(也就是说,如果他们使用类似的技术来管理他们的缩进)。

例如,您可以执行以下操作

(put 'match 'clojure-indent-function 2)

控制如何clojure-mode缩进特定形式。

还值得注意的是,虽然缩进级别通常是为宏指定的,但它也适用于函数。

于 2013-08-14T17:53:45.220 回答
1

除了 jbm 所说的,declare不是 Emacs Lisp 版本 22 之前的一部分(或者它可能是 21)。因此,如果您希望您的代码也可用于较旧的 Emacs 版本,请不要使用declare.

于 2013-08-14T18:01:21.317 回答
0

第一个扩展到第二个,因此没有技术差异。现在第一个是推荐的,第二个是底层实现。

于 2013-08-15T13:43:27.507 回答