【问题标题】:Hidden features of ClojureClojure 的隐藏特性
【发布时间】:2011-01-30 10:36:27
【问题描述】:

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

我在回答这些类似问题时发现了一些非常有趣的信息:

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

【问题讨论】:

    标签: clojure


    【解决方案1】:

    Clojure 有一个不可变的持久队列数据类型 PersistentQueue,但它(还没有?)没有文字阅读器语法或 Clojure 包装函数,因此您必须通过 Java 调用创建一个。队列 conj (push) 到后面并从前面弹出,性能良好。

    user> (-> (clojure.lang.PersistentQueue/EMPTY)
              (conj 1 2 3)
              pop)
    (2 3)
    

    将 conj 列在前面并从前面弹出。向量 conj 到后面并从后面弹出。所以队列有时正是您所需要的。

    user> (-> ()
              (conj 1 2 3)
              pop)
    (2 1)
    user> (-> []
              (conj 1 2 3)
              pop)
    [1 2]
    

    【讨论】:

    • 哇。从我的计算机列表中弹出 100000 个项目大约需要 12 毫秒。将列表转换为队列并弹出所有内容大约需要 0.2。这对我正在编写的程序有很大帮助。
    【解决方案2】:
    (defn foo [a & [b c]] ...)
    

    你可以解构 rest 参数。

    更新:

    对 git repo (29389970bcd41998359681d9a4a20ee391a1e07c) 的最新提交使得执行关联解构成为可能:

    (defn foo [a & {b :b c :c}] ...)
    

    this 的明显用途是用于关键字参数。请注意,这种方法可以防止将关键字参数与其余参数混合(并不是人们可能经常需要的东西)。

    (defn foo [a & {:keys [b c] :or {b "val1" c "val2"}] ...)
    

    如果您想要关键字参数的默认值。

    【讨论】:

      【解决方案3】:

      read-eval 阅读器宏:#=

      (read-string "#=(println \"hello\")")
      

      如果在用户输入中使用read,此宏可能会带来安全风险(这本身可能是个坏主意)。您可以通过将*read-eval* 设置为false 来关闭此宏。

      【讨论】:

        【解决方案4】:

        您可以将apply 函数用于无限的参数序列。例如

        (apply concat (repeat '(1 2 3)))
        

        产生一个 1,2,3,1,2,3 的惰性序列...当然,要使其工作,该函数还必须对其参数列表是惰性的。

        【讨论】:

        • 有更好的方法来做到这一点(循环'(1 2 3))
        • @nickik:当然——(repeat '(1 2 3)) 只是作为示例无限序列来展示(apply concat ...) 的工作原理。
        【解决方案5】:

        来自越来越好的 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"))))
        

        【讨论】:

          猜你喜欢
          • 2011-03-19
          • 1970-01-01
          • 1970-01-01
          • 2010-11-07
          • 2010-09-15
          • 2010-11-07
          • 2010-09-22
          • 2010-10-31
          • 2010-10-31
          相关资源
          最近更新 更多