gpt4 book ai didi

clojure - 为什么要使用阅读器宏#'?

转载 作者:行者123 更新时间:2023-12-02 07:21:12 25 4
gpt4 key购买 nike

我真的不明白这个宏是什么。

(def n 12)
=> #'lambda.core-test/n
#'n
=> #'lambda.core-test/n
(= #'n n)
=> false
(= #'n #'n)
=> true
(= 12 #'n)
=> false

我在某处读到 #'x(var x) 相同,所以

(var n)
=> #'lambda.core-test/n
(var-get (var n))
=> 12

当重新评估符号的定义在 REPL 中不起作用时,人们似乎会使用它。

这个宏到底是做什么的,它与重新评估有什么关系?

最佳答案

#'x 只是 (var x)

的简写

https://clojuredocs.org/clojure.core/var

http://clojure.org/special_forms

你会使用其中任何一个的原因是当你想引用变量本身而不是存储在变量中的值时。例如,您可能想要编写一个文档生成器,从一组变量中提取文档字符串、参数列表和其他元信息。为此,您可以使用:

(def some-var "With a docstring" 1)
(meta (var some-var)) ;; or
(meta #'some-var)

我最常将此阅读器宏与 Stuart Sierra 的组件库结合使用。 https://github.com/stuartsierra/component

例如,在定义了一个新系统(使用组件库)之后,我经常需要对定义的系统做一些有状态的改变来启动或停止它。我不想引用 var x 中定义的不可变值,对其进行操作,然后返回一个新的不可变值 y,而是想就地更新 var x 的值,更改实际的 var x 本身。这是一个代码示例。

(require 'com.stuartsierra.component)
(def x (new-system))
(alter-var-root #'x com.stuartsierra.component/start)

https://clojuredocs.org/clojure.core/alter-var-root

FWIW 大多数 clojure 开发人员在他们的日常工作中不会接触这个阅读器宏,但绝对值得掌握。希望对您有所帮助!

关于clojure - 为什么要使用阅读器宏#'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45695829/

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