跳转到内容

学习 Clojure/编码规范

来自 Wikibooks,开放书籍,开放世界

因为 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 开头的向量从其行内部开始,所以下面两行继续该向量的对齐方式正好在开头的 [ 的右边。规则是

  1. 将续行缩进 2 个空格...
  2. 除非有机会对齐开头的 (, [, 或 { 字符...
  3. 或者除非继续内部字面量。

本质上,总是缩进到属于 (, [, 或 { 的元素之下。诚然,这种方案确实需要一些时间来适应,无论是阅读还是编写。

在 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 这样的文本编辑器可以帮助你处理括号匹配和缩进风格。

Previous page
基本语法
学习 Clojure Next page
函数式编程
编码规范
华夏公益教科书