Clojure的隐藏功能

时间:2010-03-22 16:34:43

标签: clojure

你发现自己使用Clojure的一些鲜为人知但有用的功能?随意分享小技巧和习语,但尽量限制自己为Core和Contrib。

我在这些类似问题的答案中找到了一些非常有趣的信息:

对于其他语言还有更多“隐藏功能”问题,所以我认为为Clojure提供一个也很好。

5 个答案:

答案 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"))))