你们发现Clojure中哪些不太被人知道但很有用的特性?欢迎分享一些小技巧和惯用法,但请尽量限制在Core和Contrib范围内。
我在类似问题的答案中找到了一些非常有趣的信息:
还有许多其他语言的“隐藏特性”问题,所以我认为也应该有一个关于Clojure的。
你们发现Clojure中哪些不太被人知道但很有用的特性?欢迎分享一些小技巧和惯用法,但请尽量限制在Core和Contrib范围内。
我在类似问题的答案中找到了一些非常有趣的信息:
还有许多其他语言的“隐藏特性”问题,所以我认为也应该有一个关于Clojure的。
Clojure拥有一个不可变的持久队列数据类型PersistentQueue,但它尚未具有字面读取器语法或Clojure包装函数,因此您必须通过Java调用来创建一个。 队列使用良好的性能在后面进行conj(推)操作,并从前面进行pop操作。
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]
(defn foo [a & [b c]] ...)
你可以使用解构赋值来处理剩余参数。(defn foo [a & {b :b c :c}] ...)
这个方法的明显用途是用于关键字参数。注意,这种方法防止将关键字参数与剩余参数混合使用(不过这不是经常需要的事情)。
(defn foo [a & {:keys [b c] :or {b "val1" c "val2"}] ...)
如果您想要关键字参数的默认值。
读取-求值的读取宏:#=
(read-string "#=(println \"hello\")")
如果在用户输入上使用read
(本身可能是一个糟糕的想法),则此宏可能会带来安全风险。您可以通过将*read-eval*
设置为false
来关闭此宏。
(apply concat (repeat '(1 2 3)))
该函数生成一个惰性序列,包含1,2,3,1,2,3...。当然,为了使该函数正常工作,它还必须对其参数列表进行惰性处理。
(repeat '(1 2 3))
只是一个无限序列的序列的示例,以展示 (apply concat ...)
的工作原理。 - Rafał Dowgird从越来越好的ClojureDocs网站上,有一个使用juxt的习惯用法
juxt
http://clojuredocs.org/clojure_core/clojure.core/juxt非常有用,可以将结果数据分叉到多个终止函数中。
(->> "一些要打印并保存到文件的文本"
((juxt
println
(partial spit "useful information.txt"))))