clojure - 你能给我一些 -> 宏的现实例子吗?

标签 clojure macros

这似乎是一个强大的宏,但我无法将其应用于除了愚蠢的示例之外的任何内容。你能给我展示一下它的实际用途吗?

谢谢!

最佳答案

比较:

user> (:baz (:bar (:foo {:foo {:bar {:baz 123}}})))
123
user> (java.io.BufferedReader. (java.io.FileReader. "foo.txt"))
#<BufferedReader java.io.BufferedReader@6e1f8f>
user> (vec (reverse (.split (.replaceAll (.toLowerCase "FOO,BAR,BAZ") "b" "x") ",")))
["xaz" "xar" "foo"]

至:

user> (-> {:foo {:bar {:baz 123}}} :foo :bar :baz)
123
user> (-> "foo.txt" java.io.FileReader. java.io.BufferedReader.)
#<BufferedReader java.io.BufferedReader@7a6c34>
user> (-> "FOO,BAR,BAZ" .toLowerCase (.replaceAll "b" "x") (.split ",") reverse vec)
["xaz" "xar" "foo"]
当您需要一种简洁的方式来嵌套调用时,可以使用

->。它可以让您按照调用的顺序列出调用,而不是从内到外,这样更具可读性。在第三个示例中,请注意某些参数与其所属函数之间的距离有多大; -> 让您可以更清晰地对参数和函数调用进行分组。因为它是一个宏,所以它也适用于 Java 调用,这很好。

-> 并不是那么强大,它只是偶尔为您节省一些括号。使用与否是风格和可读性的问题。

clojure.zip的底部举一些极端的例子来说明这有什么帮助。

(-> dz next next next next next next next next next remove up (append-child 'e) root)

关于clojure - 你能给我一些 -> 宏的现实例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1609420/

相关文章:

lisp - 如何在 POST 请求中发送文件?

macros - 你能强制 Clojure 宏评估它的参数吗?

clojure - 为什么在此 ClojureScript 片段中使用 ^ 字符?

macros - 在guile方案中,如何防止从另一个宏调用宏时重命名?

arrays - 将文件内容加载到静态字节数组中

Clojure 集/项目不维护顺序。该怎么办?

clojure - 以下 clojure 代码如何运行?

C 可变参数宏无法编译

c++ - C/C++ 宏扩展与代码生成

c++ - #define 在模式之后有两个标记