如何正确缩进Clojure/Lisp代码?

7
我想缩进以下代码片段。 一个Lisper会如何缩进这个代码? 我特别困惑应该在哪里加换行符。
(defn primes [n]
  (letfn [(sieve [table removal]
                 (assoc table removal false))
          (primebools [i table]
                       (cond 
                         (= i n) table 
                         (table i) (recur (inc i) 
                                          (reduce sieve 
                                                  table 
                                                  (range (* i i) n i))) 
                         :else (recur (inc i) 
                                      table)))]
    (let [prime? (primebools 2 (apply vector (repeat n true)))]
      (filter prime? (range 2 n)))))

4
如果对缩进有疑惑,可以将内容粘贴到Emacs的clojure模式中,并使用C-M-q命令。随意添加新行来使代码看起来更清晰。 - Brian Carper
2个回答

5
(defn primes [n]
  (letfn [(sieve [table removal]
            (assoc table removal false))
          (primebools [i table]
            (cond 
              (= i n) table 
              (table i) (recur (inc i) 
                          (reduce sieve table 
                            (range (* i i) n i))) 
              :else (recur (inc i) table)))]
    (let [prime? (primebools 2 (apply vector (repeat n true)))]
      (filter prime? (range 2 n)))))

这是我会做的方法。

7
我会将recur函数的参数缩进到相同的列。 - Svante

1

除了 @dnolen 的回答之外,我通常在以下情况下换行:

  1. 有新的函数(例如你的前两行)
  2. 需要缩进长或重要的函数参数(例如 cond 块)
  3. 逻辑上保持每行少于80个字符,并将长思想分解成较小的块
  4. 最重要的是要保持一致!

然后只需对齐和缩进行,以使缩进深度相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接