学习 Clojure/编码规范
外观
因为 Clojure 代码只是一堆字面量,如果不以可读的风格缩进,就很难阅读。格式良好的 Clojure 看起来像这样
(defn my-zipmap [keys vals]
(loop [map {}
ks (seq keys)
vs (seq vals)]
(if (and (not-empty ks) (not-empty vs))
(recur (assoc map (first ks) (first vs))
(rest ks)
(rest vs))
map)))
(my-zipmap [:a :b :c] [1 2 3])
这里的一般想法是,当在多行上展开时,列表或向量的元素应该在下面的行上缩进。注意,以 (loop
开头的行在 (defn
下缩进了两个空格,因为以 (loop
开头的列表是 以 (defn
开头的列表的直接元素。然而,在这之下,作者通过选择将 (recur
与上面的 (and
对齐而不是从 (if
缩进两个空格来打破了这条规则。还要注意,以 [map
开头的向量从其行内部开始,所以下面两行继续该向量的对齐方式正好在开头的 [
的右边。规则是
- 将续行缩进 2 个空格...
- 除非有机会对齐开头的 (, [, 或 { 字符...
- 或者除非继续内部字面量。
本质上,总是缩进到属于 (, [, 或 { 的元素之下。诚然,这种方案确实需要一些时间来适应,无论是阅读还是编写。
在 Lisp 中,你经常会遇到很多尾随括号,这是非常典型的
(defn supply-arg [arg flist]
(loop [flist flist cnter 0]
(if (first flist) (do ((first flist) arg)
(recur (rest flist) (+ 1 cnter)))))) ; remember, the + in this line is just an ordinary symbol
像 Emacs 这样的文本编辑器可以帮助你处理括号匹配和缩进风格。