gpt4 book ai didi

clojure - 当作为前缀添加到宏中的变量时 ~' 意味着什么

转载 作者:行者123 更新时间:2023-12-03 00:40:25 26 4
gpt4 key购买 nike

鉴于下面的宏 -

(defmacro defhello [fn-name body]   `(defn ~fn-name [~'name] ~body))

以及调用时定义的函数 -

(defhello greeting (str "Hello" name))

并称为

(greeting "Joe")

,将返回

你好,乔

我不明白name参数前面的~'的用法?它有什么作用?引号 (') 和取消引号 (~) 不会互相抵消吗?当它们一起使用时会发生什么?为什么不直接写名字而没有它们呢?

最佳答案

简而言之,~ 以语法引用形式计算表达式,就像它对 ~fn-name 所做的那样。在本例中,要计算的表达式是 'name,其中结果是非限定符号 name

但是,让我们一次分解一下。

如果您只有非限定符号 name,它将在运行时被评估为 clojure.core/name1。这会导致 defn 形式不正确并导致编译器异常。

(defn greeting [clojure.core/name] (str "Hello" name)) 

如果您只有带引号的非限定符号 'name,它仍会在运行时进行评估。不同之处在于它会扩展为 (quote clojure.core/name)。同样,这会导致 defn 形式不正确并导致编译器异常。

(defn greeting [(quote clojure.core/name)] (str "Hello" name))

最后,通过使用 ~'name,您将在编译时评估引用形式,从而产生不合格的符号 name,从而为您留下正确的 defn 形式。

(defn greeting [name] (str "Hello" name))

1 - 对于此示例来说这是正确的,因为它假设另一个 name 函数不存在。

关于clojure - 当作为前缀添加到宏中的变量时 ~' 意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12351991/

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