when-and语句应该如何排版?

我知道这种事情无所谓……但是,呃,反正我是水定

(when (and (sth1) (sth2))
  (body))

OR

(when (and (sth1)
           (sth2))
  (body))

在语句都不太长的情况下,哪种好点?

无所谓好坏。

另外既然这么在意风格的话——when 的缩进是两个空格,不是四个。

另外我只是在论坛上没写对而已…… 所以就是哪个觉着顺眼就用哪个?

用aboabo的lispy自动排版一下,是哪种就用那种,这样以后排版方便。

我投2一票 楼主啊,代码风格这种事,在没有和别人明确合作要求下,难道不应该以自己的审美为准?

无所谓好坏,以自己是否能一眼看清楚为原则。

如果是两个很简短的条件,就写一行;如果是复杂的组合语句,或者两个语句存在相似性、而你需要突出它们的差异,就写两行。

我觉得这里 and 没特殊之处,所以撇开 and,写 Emacs Lisp1 时常会遇到需要考虑何时和如何断行2的问题,常见的理由有:

  1. 避免一行过长;
  2. 更美观、紧凑;
  3. 更符合逻辑

但这些理由之间可能会有冲突,无法同时满足,所以需要权衡。另外,可以断行的地方实在是太多了。同样一段代码,不同的人(甚至同一个人在不同的时机下),断行的选择很容易不同。举个例子:

(defun eww-thing-at-point ()
  (interactive)
  (let ((text (or (and (use-region-p)
                       (buffer-substring-no-properties
                        (region-beginning) (region-end)))
                  (current-word)
                  (read-string "EWW: "))))
    (eww text)))

(defun eww-thing-at-point ()
  (interactive)
  (let ((text
         (or (and (use-region-p)
                  (buffer-substring-no-properties
                   (region-beginning)
                   (region-end)))
             (current-word)
             (read-string "EWW: "))))
    (eww text)))

...

不知道这算优点还是缺点,但 Emacs Lisp 中如何断行常常会困扰到我。


1 或许其它的语言都有类似的问题,只是 Emacs Lisp 中更常见些。 2 不仅仅是要不要断行,也要考虑在什么位置断行。

实际上C也挺容易遇到这类问题 (关于大括号的那个有名的争论) ……只不过相比而言规范比较死/已经有很多公认的规则了,所以也没那么多争论。 Emacs Lisp比其他的Lisp在格式问题上似乎更加自由。所以就成了问题……

我目前的方案是:

  • sth1和sth2都很长——断行;
  • sth1/sth2中有一个很长,另一个很短——不断行;
  • sht1和sth2都很短——看逻辑,如果sth1和sth2有联系 (比如你的(region-beginning) (region-end)),就不断,否则断行;

唯一不太容易被断行困扰的估计只有缩进和 / 或断行是句法的一部分的那种语言了吧……比如Python和Shell Script……

从一个人写的 Emacs Lisp 的风格可以看出 TA 主要是写什么语言的。


以尽量紧凑为佳。

1 个赞

然而垂直紧凑重要还是水平紧凑重要? 这真的是个问题

看着舒服就行

什么?还有垂直紧凑这种东西?改行间距?

垂直紧凑=行数少

哈,我就经常做些违反 elisp 惯例的事情,例如:

(let ((...))
  (when (...)
    (body)
    ))

主要考虑的是:

  • 避免编辑出错,毕竟整行复制/粘贴/删除是最方便的,其它语言的一些风格指南鼓励 trailing comma 也是这个原因:

    // bad
    [
        1,
        2
    ]
    
    // good
    [
        1,
        2,
    ]
    
  • 突出 body

  • 强调结束,避免与后续代码纠缠。至今不太习惯 elisp 的缩进,代码稍微复杂一点,缩进就不太直观了。如果写成 body)))),而且这一行比较长的话,就难免要怀疑下一行跟 body 是不是在同一个 if/when 下了

简单来说还是照顾视觉,我个人看代码首先是块,然后才是行。所以把逻辑块排版清楚,会更容易理解。

行少=绩效低=钱少

就跟语文的阅读理解题……