-6ren">
gpt4 book ai didi

clojure - 什么时候在 Clojure 宏中使用 ~'some-symbol?

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:06 25 4
gpt4 key购买 nike

当我阅读 The Joy of Clojure 时,我偶然发现了一些代码。

(fn [~'key ~'r old# new#]
(println old# " -> " new#)

此声明 ~'some-symbol 的确切行为是什么。

some-symbol#'~another-symbol 或 gensym 的区别?

The Joy Of Clojure:(没看懂)

You’ll see the pattern ~'symbol at times in Clojuremacros for selectively capturing a symbolic name in the body of amacro. The reason for this bit of awkwardness[11] is that Clojure’ssyntax-quote attempts to resolve symbols in the current context,resulting in fully qualified symbols. Therefore, ~' avoids thatresolution by unquoting a quote.

最佳答案

您可以在 Tupelo 库中使用 the Literate Threading Macro 查看示例.我们希望用户键入符号 it 并让宏识别它。这是定义:

(defmacro it->
"A threading macro like as-> that always uses the symbol 'it'
as the placeholder for the next threaded value "
[expr & forms]
`(let [~'it ~expr
~@(interleave (repeat 'it) forms)
]
~'it))

这也称为“照应”宏。然后用户创建如下代码:

(it-> 1
(inc it) ; thread-first or thread-last
(+ it 3) ; thread-first
(/ 10 it) ; thread-last
(str "We need to order " it " items." ) ; middle of 3 arguments
;=> "We need to order 2 items." )

用户在他们的代码中包含特殊符号 it,这是宏所期望的(& 在这种情况下是必需的)。

这有点特殊。在大多数情况下,无论用户选择什么符号,您都希望宏起作用。这就是为什么大多数宏使用 (gensym...) 或带有“#”后缀的阅读器版本的原因,如下例所示:

(defmacro with-exception-default
"Evaluates body & returns its result. In the event of an exception, default-val is returned
instead of the exception."
[default-val & body]
`(try
~@body
(catch Exception e# ~default-val)))

这是“正常”情况,其中宏创建一个“局部变量”e#,保证不与任何用户符号重叠。一个类似的例子显示了 spyx 宏创建一个名为 spy-val# 的“局部变量”来临时保存表达式 expr 的计算结果:

(defmacro spyx
"An expression (println ...) for use in threading forms (& elsewhere). Evaluates the supplied
expression, printing both the expression and its value to stdout, then returns the value."
[expr]
`(let [spy-val# ~expr]
(println (str (spy-indent-spaces) '~expr " => " (pr-str spy-val#)))
spy-val#))

请注意,对于 (println...) 语句,我们看到了与 '~expr 相反的语法——但这是另一天的话题。

关于clojure - 什么时候在 Clojure 宏中使用 ~'some-symbol?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40270625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com