比如我有一大堆属于一个包的变量,我应该写一个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)
)
明明后一种可以很方便地注释/删除中间两行中的一行。
大概是约定俗成了?
Chris
9
我记得邮件列表里说过 一行一个和一行多个效率完全一样
LdBeth
10
Lisp conventions.
因為 Emacs 对 Lisp 代碼的操作是以 sexp 而不是 line 為单位的,comment on region 更是能自動处理。你 Vim 用多了。
2 个赞
我个人感觉, 社区习惯, 其产生原因是我们意想不到的, 就类似: 两匹马屁股的宽度决定火车车轨的间距。。。。。
但另一方面, 社区习惯类似一种隐性的api, 你如果不遵守, 你就遭人唾弃。。。。 就因为你的另类。
任何语言中,定义都推荐一行一个。
可以保持代码的简洁,有效利用编辑器的高亮,便于修改,便于改bug,,,,
我会把密切相关的选项放到一起写,比如:
(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)
当然这纯粹是个人喜欢问题。
感觉没啥区别,全是习惯问题。速度相差不大的情况下相对来说,安全更重要些吧。