2017-08-15 44 views
2

我真不明白这是什么宏。为什么使用读者宏#'?

(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不起作用。

这究竟宏和如何做它涉及到重新评估?

+0

是'#'x'膨胀以'(VAR X)',其评估对VAR本身,而不是它的值。 – Lee

+0

在哪个具体情况下,我宁愿使用var而不是它的值? –

+1

如果'x'有元数据,那么你可以用'(元#'X)'检索。 'alter-var-root'也取var '(alter-var-root#'n inc)'。 – Lee

回答

7

#'x(var x)

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

http://clojure.org/special_forms

你会使用以下两种原因只是简写,是当你想引用变量本身,而不是存储中的价值变量。例如,你可能想要写一个文档生成器,从一组瓦尔的拉动文档字符串,arglists和其他元信息。要做到这一点,你可以使用:

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

我最经常与斯图尔特Sierra的组件库一起使用该阅读器宏。 https://github.com/stuartsierra/component

例如,定义一个新的系统(使用的构件库)后,我经常需要做一些状态突变所定义的系统启动或停止它。相反,指的是不可变的值作为VAR X定义,作用于它,然后返回一个新的不可改变的y值,我想更新变种x的值的地方,改变实际变种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的开发者不会在他们的日常工作接触这个读者宏,但绝对值得拥有的把握。希望这有助于!