Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure的隐藏特征_Clojure - Fatal编程技术网

Clojure的隐藏特征

Clojure的隐藏特征,clojure,Clojure,您发现自己在使用Clojure的哪些鲜为人知但有用的功能?可以随意分享一些小技巧和习惯用语,但要尽量限制自己的核心和贡献 我在这些类似问题的答案中发现了一些非常有趣的信息: 其他语言还有许多隐藏的功能问题,因此我认为Clojure也有一个隐藏的功能问题会很好。read eval reader宏:= 如果在用户输入上使用read,则此宏可能会带来安全风险,这本身可能是个坏主意。您可以通过将*read eval*设置为false来关闭此宏。Clojure有一个不可变的持久队列数据类型Persiste

您发现自己在使用Clojure的哪些鲜为人知但有用的功能?可以随意分享一些小技巧和习惯用语,但要尽量限制自己的核心和贡献

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


其他语言还有许多隐藏的功能问题,因此我认为Clojure也有一个隐藏的功能问题会很好。

read eval reader宏:=


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

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

user> (-> (clojure.lang.PersistentQueue/EMPTY)
          (conj 1 2 3)
          pop)
(2 3)
在前面列出conj并从前面弹出。向量连接到后面并从后面弹出。因此,有时排队正是您所需要的

user> (-> ()
          (conj 1 2 3)
          pop)
(2 1)
user> (-> []
          (conj 1 2 3)
          pop)
[1 2]
您可以分解rest参数

更新:

对git repo 29389970bcd41998359681d9a4a20ee391a1e07c的最新提交使得可以执行如下关联分解:

(defn foo [a & {b :b c :c}] ...)
它的明显用途是用于关键字参数。注意,这种方法可以防止关键字参数与rest参数的混合,而不是经常需要的

(defn foo [a & {:keys [b c] :or {b "val1" c "val2"}] ...)
如果您想要关键字参数的默认值。

您可以将函数应用于无限参数序列。比如说

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

生成1,2,3,1,2,3的惰性序列。。。当然,要使其工作,函数还必须在参数列表方面是惰性的。

来自日益良好的ClojureDocs站点,一个使用juxt的习惯用法

有一种更好的方法来完成这个循环'1 23@nickik:当然-repeat'1 2 3只是作为一个无限序列的示例,以展示如何应用concat。。。真管用,哇。从列表中弹出100000项我的计算机需要12毫秒。将列表转换为队列并弹出所有内容需要~0.2秒。这对我正在编写的程序有很大帮助。
(defn foo [a & {:keys [b c] :or {b "val1" c "val2"}] ...)
(apply concat (repeat '(1 2 3)))
;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"))))