我是Clojure的新手。我可以理解我编写的代码,但是以后很难理解。
括号很难匹配。
在各种情况下,有关命名约定和缩进的通用约定是什么?
例如,我写了一个示例性的解构示例来理解,但是第二次看起来却完全不可读。
(defn f [{x :x y :y z :z [a b c] :coll}] (print x " " y " " z " " a " " b " " c))
在进行解构的情况下,最好直接在参数级别执行此操作,还是启动一个let表格然后再继续执行?
我是Clojure的新手。我可以理解我编写的代码,但是以后很难理解。
括号很难匹配。
在各种情况下,有关命名约定和缩进的通用约定是什么?
例如,我写了一个示例性的解构示例来理解,但是第二次看起来却完全不可读。
(defn f [{x :x y :y z :z [a b c] :coll}] (print x " " y " " z " " a " " b " " c))
在进行解构的情况下,最好直接在参数级别执行此操作,还是启动一个let表格然后再继续执行?
Answers:
使用-
了连字符(这将是在其他语言中的下划线或骆驼的情况下)。
(defn add-one
[i]
(inc i))
谓词(即返回true或false的函数)以?
示例结尾:odd?
even?
nil?
empty?
状态更改程序以结尾!
。你还记得set!
吧?要么swap!
选择简短的变量名长度,具体取决于它们的范围。这意味着,如果您的辅助变量很小,则通常只能使用一个字母的名称。(map (fn [[k v]] (inc v)) {:test 4 :blub 5})
根据需要选择更长的变量名,尤其是当它们用于大量代码行并且您无法立即猜测其用途时。(我的想法)。
我觉得很多Clojure程序员倾向于使用通用名称和简称。但这当然不是一个客观的观察。关键是实际上很多clojure函数都是通用的。
drop
,take
,assoc
,等,然后有一个很好的文章描述的方式来选择一个有意义的名字:http://ecmendenhall.github.io/blog/blog/2013/09/ 02 / clean-clojure-有意义的名称/您实际上可以命名lambda函数。这对于调试和分析非常方便(我的经验是使用ClojureScript)。
(fn square-em [[k v]] {k (* v v)})
使用内联lambda函数#()
尽可能方便
不应只有parens行。即立即关闭括号。请记住,parens是用于编辑器和编译器的,缩进适合您。
功能参数列表换行
(defn缺点 [ab] (清单ab))
如果您考虑文档字符串,这是有道理的。它们在函数名称和参数之间。以下文档字符串可能不是最明智的;)
(defn缺点 “对事物进行配对” [ab] (清单ab))
(defn f [{x:x y:y Z Z [abc]:coll}] (打印x“” y“” z“” a“” b“” c))
(您也可以根据需要输入,
,但这感觉不拘一格)。
对于缩进,请使用足够好的编辑器。多年前,这是用于Lisp编辑的emacs,今天的vim也很棒。典型的clojure IDE也应提供此功能。只是不要使用随机文本编辑器。
在命令模式下的vim中,可以使用=
命令正确缩进。
如果命令太长(嵌套等),则可以在第一个参数后插入换行符。现在,以下代码是毫无意义的,但它说明了如何对表达式进行分组和缩进:
(+(if-let [age(:personal-age coll)] (如果(> 18岁) 年龄 0)) (计数(范围(-3 b) (减少+ (范围b 10)))))
好的缩进意味着您不必计算括号。括号用于计算机(解释源代码并对其进行缩进)。缩进是为了您容易理解。
for
和doseq
形式来自Scheme的背景,我为能够理解map
lambda函数等感到非常自豪。因此,我经常会写这样的东西
(map (fn [[k x]] (+ x (k data))) {:a 10 :b 20 :c 30})
这很难读。该for
形式是更好的方法:
(for [[k x] {:a 10 :b 20 :c30}]
(+ x (k data)))
map有很多用途,如果您使用命名函数,那真的很棒。即
(map inc [12 30 10]
(map count [[10 20 23] [1 2 3 4 5] (range 5)])
使用线程宏->
和->>
以及doto
时适用。
关键是线程宏使源代码看起来比函数组合更线性。如果没有线程宏,下面的代码几乎是不可读的:
(f (g (h 3) 10) [10 3 2 3])
与之比较
(->
(h 3)
(g 10)
(f [10 3 2 3]))
通过使用线程宏,通常可以避免引入仅使用一次的临时变量。
doc
或source
在REPL中)。咆哮的结尾,一个另外的很好的答案
apples
不是时xs
,您认为它特定于苹果。然后,我还认为函数参数名称比for for循环变量更进一步。因此,如果需要,您可以将它们放长一点。作为最后一个念头:我会离开你“名称代码不重视” concatenative.org/wiki/view/Concatenative%20language/...