你发现自己使用Clojure的一些鲜为人知但有用的功能?随意分享小技巧和习语,但尽量限制自己为Core和Contrib。
我在这些类似问题的答案中找到了一些非常有趣的信息:
对于其他语言还有更多“隐藏功能”问题,所以我认为为Clojure提供一个也很好。
答案 0 :(得分:23)
Clojure有一个不可变的,持久的队列数据类型PersistentQueue,但它(但是?)没有文字阅读器语法或Clojure包装函数,所以你必须通过Java调用创建一个。队列结合(推)到后面并从前面弹出,表现良好。
user> (-> (clojure.lang.PersistentQueue/EMPTY)
(conj 1 2 3)
pop)
(2 3)
列出前面的连接并从前面弹出。矢量组合到后部并从后部弹出。所以队列有时候正是你所需要的。
user> (-> ()
(conj 1 2 3)
pop)
(2 1)
user> (-> []
(conj 1 2 3)
pop)
[1 2]
答案 1 :(得分:13)
(defn foo [a & [b c]] ...)
你可以解构其余的论点。
更新
git repo的最新提交(29389970bcd41998359681d9a4a20ee391a1e07c)使得可以像这样执行关联解构:
(defn foo [a & {b :b c :c}] ...)
这显然用于关键字参数。请注意,这种方法可以防止将关键字参数与其他参数混合使用(而不是经常需要的那些)。
(defn foo [a & {:keys [b c] :or {b "val1" c "val2"}] ...)
如果您想要关键字参数的默认值。
答案 2 :(得分:11)
read-eval阅读器宏:#=
(read-string "#=(println \"hello\")")
如果在用户输入上使用read
(这可能是一个坏主意),此宏可能会带来安全风险。您可以通过将*read-eval*
设置为false
来关闭此宏。
答案 3 :(得分:8)
你可以apply
函数到无限参数序列。例如
(apply concat (repeat '(1 2 3)))
产生一个懒惰的1,2,3,1,2,3序列......当然,为了使它起作用,该函数也必须在其参数列表方面是懒惰的。
答案 4 :(得分:6)
来自越来越好的ClojureDocs网站使用juxt
的成语
http://clojuredocs.org/clojure_core/clojure.core/juxt
;juxt is useful for forking result data to multiple termination functions
(->> "some text to print and save to a file"
((juxt
println
(partial spit "useful information.txt"))))