管理clojure中的括号数量

时间:2012-04-10 19:37:54

标签: clojure lisp readability code-readability

我是clojure的新手,我正在努力解决的主要问题是编写可读代码。我经常最终得到类似下面的功能。

(fn rep 
  ([lst n]
    (rep (rest lst)
    n
    (take n 
      (repeat (first lst)))))
  ([lst n out]
    (if
      (empty? lst)
      out
      (rep 
        (rest lst) n
        (concat out (take n 
          (repeat 
            (first lst))))))))

有很多端括号的构建。有哪些方法可以减少这种情况或将其格式化,以便更容易找到丢失的括号?

8 个答案:

答案 0 :(得分:15)

使用Emacs的paredit模式(在其他一些编辑器中也模仿)意味着你通常 - 除非你用鼠标/强制非结构化选择进行复制/粘贴 - 处理匹配的括号/括号/括号和相关的缩进,不需要计算。

带有https://github.com/technomancy/emacs-starter-kit的Emacs(强烈推荐!)默认情况下为clojure启用了paredit。否则,请参阅http://emacswiki.org/emacs/ParEdit

答案 1 :(得分:13)

除了拥有支持大括号匹配的编辑器之外,您还可以尝试使代码更少嵌套。我相信你的功能可以改写为:

(defn rep [coll n] (mapcat (partial repeat n) coll))

当然,这更多的是艺术(手工艺)而不是科学,但有些指针(按随机顺序):

  • 4clojure上的问题及其顶级用户的解决方案(解决特定问题后可见) - 我相信Chris Houser在句柄chouser
  • 之下
  • 说到CH - “Clojure的喜悦”是一个非常有用的读物​​
  • 浏览clojure.core上的文档 - 那里有很多有用的功能
  • ->->>线程宏非常可用于展平嵌套代码
  • stackoverflow - 世界上一些最聪明,最乐于助人的人在那里回答问题; - )

答案 2 :(得分:7)

在这种情况下,为括号着色的编辑器非常有用。例如,以下是您的代码在我的vim编辑器中的外观(使用vimclojure):

Rainbow colors

由于您没有说明您使用的编辑器,因此您必须适当地为编辑器找到彩虹着色功能。

答案 3 :(得分:3)

(fn rep 
  ([lst n]
    (rep lst n nil))
  ([lst n acc]
    (if-let [s (seq lst)]
      (recur (rest s) n (concat acc (repeat n (first s))))
      acc)))
我认为,这更具可读性。请注意:

  • 你应该在尾部递归时使用recur
  • 您应该使用seq进行测试 - 请参阅http://clojure.org/lazy
  • 重复可以计算
  • concat将丢弃nil,这样可以节省自己的重复次数
  • 你不需要为每个开放的paren
  • 开始新的一行

至于parens - 您的编辑/ ide应该照顾它。我在这里打字是盲人,所以请原谅我,如果这是错的......

[RafałFowgird的代码更短;我也在学习......]

[更新:]重新阅读“懒惰”链接后,我认为我一直在错误地处理懒惰的序列,

答案 4 :(得分:3)

我无法强烈回应使用paredit的价值,或者在另一个编辑器中使用某些类似功能。它让你不再关心parens - 它们总是完美地匹配自己,而且将“(foo (bar x) y)改为(foo (bar x y))”等单调乏味,容易出错的编辑任务成为一次单击。一个星期左右,paredit会让你感到沮丧,因为它会阻止你手动操作,但是一旦你学会了处理parens的自动方法,你将永远无法回头。

我最近听到有人说,而且我认为大致准确,没有paredit编写lisp就像编写没有自动完成的java(可能,但不是很愉快)。

答案 5 :(得分:2)

我不确定你能否避开所有括号。然而,我所看到的Lispers所做的是使用编辑器匹配/突出显示,甚至可能使用彩虹括号:http://emacs-fu.blogspot.com/2011/05/toward-balanced-and-colorful-delimiters.html

坦率地说,这些功能对于非Lisp编辑器也很有用:)

答案 6 :(得分:1)

始终使用由至少75%的消费后材料制成的100%回收封闭式括号;然后你不必为使用这么多而感到如此糟糕。

答案 7 :(得分:1)

根据您的喜好对其进行格式化。编辑的工作是以读者喜欢的任何风格显示代码。我喜欢C风格的分层树形格式,在它们自己的行上有单个括号(所有LISPers都愤怒地说: - )))))))))))))

但是,我有时会使用这种风格:

  (fn rep 
  ([lst n]
    (rep (rest lst)
    n
    (take n 
      (repeat (first lst)) )  )   )    )

这是传统样式的更新,其中括号间隔(log2分支级别)

我喜欢太空的原因是我的视力很差,我根本无法阅读密集的文字。那些愤怒的LISPers即将告诉我按照传统方式做事,好吧,每个人都有自己的方式,放松,没关系。

不能等待有人在Clojure中编写一个不错的编辑器,这不是文本编辑器而是表达式编辑器**,然后格式化问题就消失了。我自己写一个,但需要时间。我们的想法是通过向它们应用函数来编辑表达式,并且我使用拉链,逐个表达式而不是单词或字符或行来导航代码。代码由您想要的任何显示功能表示。

**是的,我知道有emacs / paredit,但我试过emacs并且不喜欢它抱歉。