我是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))))))))
有很多端括号的构建。有哪些方法可以减少这种情况或将其格式化,以便更容易找到丢失的括号?
答案 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))
当然,这更多的是艺术(手工艺)而不是科学,但有些指针(按随机顺序):
chouser
->
和->>
线程宏非常可用于展平嵌套代码答案 2 :(得分:7)
答案 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)))
我认为,这更具可读性。请注意:
seq
进行测试 - 请参阅http://clojure.org/lazy 至于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并且不喜欢它抱歉。