如果有一堆同类变量需要设置,怎么写比较好?

比如我有一大堆属于一个包的变量,我应该写一个setq还是有几个变量写几个?

1:

(setq pyim-page-length 4
      pyim-page-style 'one-line
      pyim-page-tooltip 'child-frame)

2:

(setq pyim-page-length 4)
(setq pyim-page-style 'one-line)
(setq pyim-page-tooltip 'child-frame)

如果硬要瘸子里挑将军,这两种写法哪种会好些?

谢谢各位。

类似的问题讨论过 when-and语句应该如何排版? - #14,来自 twlz0ne 也是你提问的

一行一个 steq 更安全,类似 trailing comma 的问题。一行作为一个完整的单元,复制/粘贴/删除都不容易出错,降低了出 bug 的风险,比如:

// bad
[
    1,
    2
]

这段代码如果末尾追加一行 3,忘记给 2 加逗号的概率是很大的,然后就出错了:

// bad
[
    1,
    2
    3
]

所以因该这么写:

// good
[
    1,
    2, // <--- 末尾必须有逗号
]

很多语言支持这么写,但不是强制,需要额外的工具来保证,比如 eslint 开启 dangle-comma 才能检测末行的末尾是否缺失逗号。而 go 则从语言层面做了要求:

fmt.Printf(
	"%s, %s",
	"foo",
	"bar"  // <--- 末尾必须有逗号
)

编译器直接报错。

那个问题是我问的没错……

可能是因为我还没有理解setq的工作方式吧……我到现在还觉得如果需要设置的变量不是三个而是20个的话,一行一个会很慢……

最好单独一行一行的写

确实一行一个 setq 多调了几次,但这个开销完全可以忽略:

;; 3w 次 setq
(message "%f"
         (time-elapse
          (dotimes (i 10000)
            (setq foo 1)
            (setq bar 2)
            (setq qux 3)
            ))) ;; => "0.007129"

;; 1w 次 setq
(message "%f"
         (time-elapse
          (dotimes (i 10000)
            (setq foo 1
                  bar 2
                  qux 3)
            ))) ;; => "0.005367"

其它地方随便优化点,足够你写成千上万个 setq 了。为了节省 0.00n 秒/万次 的时间,增加出错概率,很不值得。

一次 setq 多个值的时候,你很难抓出其中一对 symbol - value,特别是当赋值语句存在复杂逻辑的时候,末尾漏掉/多出 ) 的概率增加。

1 个赞

所以说最好还是安全点?

我现在的方案是:只有对那些万年不会动的变量们才使用一个setq……

这我就想到了我想了很久的一个疑问: 大家都写

(let ((foo 1))
  (1+ foo)
  (message foo))

而不是

(let ((foo 1))
  (1+ foo)
  (message foo)
  )

明明后一种可以很方便地注释/删除中间两行中的一行。
大概是约定俗成了?

因为大家都倾向于紧缩的风格

我记得邮件列表里说过 一行一个和一行多个效率完全一样

Lisp conventions.

因為 Emacs 对 Lisp 代碼的操作是以 sexp 而不是 line 為单位的,comment on region 更是能自動处理。你 Vim 用多了。

2 个赞

我个人感觉, 社区习惯, 其产生原因是我们意想不到的, 就类似: 两匹马屁股的宽度决定火车车轨的间距。。。。。

但另一方面, 社区习惯类似一种隐性的api, 你如果不遵守, 你就遭人唾弃。。。。 就因为你的另类。

任何语言中,定义都推荐一行一个。 可以保持代码的简洁,有效利用编辑器的高亮,便于修改,便于改bug,,,,

不是vim用多了,而是JSON用多了……

我会把密切相关的选项放到一起写,比如:

(setq mac-command-modifier 'meta
      mac-option-modifier 'control)

除此之外就分开写喽,比如:

(setq helm-highlight-matches-around-point-max-lines 0)
(setq helm-window-prefer-horizontal-split t)

当然这纯粹是个人喜欢问题。

感觉没啥区别,全是习惯问题。速度相差不大的情况下相对来说,安全更重要些吧。