gpt4 book ai didi

Clojure - ' (apostrophe) and ` 之间的差异(反引号)

转载 作者:行者123 更新时间:2023-12-03 08:30:13 26 4
gpt4 key购买 nike

我对 Clojure 相当陌生,我不确定我是否完全理解 Clojure 中撇号和反引号之间的区别。

(def x 5)

;; Question 1
(+ x x) ;; evaluates to 10
'(+ x x) ;; evaluates to (+ x x)
`(+ x x) ;; evaluates to (clojure.core/+ user/x user/x)

;; Question 2
`(~+ ~x ~x) ;; evaluates to (#<core$_PLUS_ clojure.core$_PLUS_@32ee28a9> 5 5)
  • 如果我错了,请纠正我,但在我看来,撇号阻止所有符号(即 + 和 x)解析为它们各自的 var,而反引号允许符号解析为它们的 var(但不计算值在 var 中)。这是准确的吗?
  • 在这里不加引号的符号 (~) 到底是做什么的?它是否将 var 评估为其实际值(即函数对象的 + 符号和数字对象的 x 符号)?如果您可以根据 Clojure 的 READ-COMPILE-EVAL 阶段来解释这一点,那也会有所帮助。
  • 最佳答案

    当您使用 ' 引用集合时,符号名称将在您输入时完全引用。

    '(+ x x) 
    => (+ x x)
    (map namespace *1)
    => (nil nil nil)
    '(bingo/+ lara/y user/z)
    => (bingo/+ lara/y user/z)
    (map namespace *1)
    => ("bingo" "lara" "user")

    当你用反引号引用一个集合时,它会尝试找到每个符号的命名空间。如果找不到,则使用当前命名空间。如果指定命名空间,它的作用与 ' 相同。具有限定的命名空间。
    `(+ x x)
    = > (clojure.core/+ user/x user/x)
    (map namespace *1)
    => ("clojure.core" "user" "user")

    当您使用时 ~`表格将简单地不加引号。这有助于构建宏,其中宏使用来自定义它的命名空间的符号以及来自使用它的命名空间的符号。
     `(+ ~'x x)
    => (clojure.core/+ x user/x)
    `(+ ~x x)
    => (clojure.core/+ 3 user/x)

    最后,您可以取消引用整个引用的东西拼接集合。
     `(+ ~@`(x x))
    => (clojure.core/+ user/x user/x)

    查看两者 x es 可以作为命名空间限定符号的列表传递,并且可以拼接到另一个列表中。您不能使用 ~~@在反引号集合之外。

    关于Clojure - ' (apostrophe) and ` 之间的差异(反引号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17800917/

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