【问题标题】:What are the rules behind the typical indenting conventions of lisp?lisp 的典型缩进约定背后的规则是什么?
【发布时间】:2018-03-26 19:32:17
【问题描述】:

模组注意事项:请注意,这个问题根本不是品味问题。我正在询问有关我在 Spacemacs 的 elisp 的默认缩进规则中遇到的缩进约定的具体信息。

为什么格式化程序会这样缩进这段代码:

(defun lispy--maybe-safe-delete-region (beg end)
  "Delete the region from BEG to END.
If `lispy-safe-delete' is non-nil, exclude unmatched delimiters."
  (if lispy-safe-delete
      (let ((safe-regions (lispy--find-safe-regions beg end)))
        (dolist (safe-region safe-regions)
          (delete-region (car safe-region) (cdr safe-region)))
        (test))
    (delete-region beg end)
    (test)))

不是这样的:

(defun lispy--maybe-safe-delete-region (beg end)
  "Delete the region from BEG to END.
If `lispy-safe-delete' is non-nil, exclude unmatched delimiters."
  (if lispy-safe-delete
      (let ((safe-regions (lispy--find-safe-regions beg end)))
        (dolist (safe-region safe-regions)
          (delete-region (car safe-region) (cdr safe-region)))
        (test))
      (delete-region beg end)
      (test)))

如您所见,默认格式没有将if sexp 的子级缩进同一级别。我不明白它的运行规则,因为let sexp 的子级是在同一级别缩进的。

【问题讨论】:

  • Vim 缩进为第二个 sn-p。
  • @EugeneSh。越来越好奇。

标签: emacs lisp indentation


【解决方案1】:

因为 Emacs Lisp 的 IF 运算符允许 one then 形式和 多个 else 形式。为了便于阅读,else 形式的缩进与 then 形式不同。

ELISP> (if (> 10 20)
           (print 'foo)
         (princ 'bar)
         (princ 'baz)
         nil)
barbaz
nil

【讨论】:

  • 如果只有一个替代表达式,格式是否与 CL if 相同?
  • @Sylwester:不,为不同数量的 else 表单制定特殊规则毫无意义。注意顺便说一句。一些 CL 像这样缩进。例如 LispWorks。
  • 确实,这与 Scheme 中的 if 形式只接受“else”部分中的单个表达式,因此约定缩进“else”和“then " 在同一列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
相关资源
最近更新 更多