Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 为什么要使用读卡器宏#';?_Clojure - Fatal编程技术网

Clojure 为什么要使用读卡器宏#';?

Clojure 为什么要使用读卡器宏#';?,clojure,Clojure,我真的不明白这个宏是什么 (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 当重新评估符号的定义在

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

(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)

之所以使用这两种方法之一,是因为您希望引用变量本身,而不是变量中存储的值。例如,您可能希望编写一个文档生成器,从一组变量中提取文档字符串、参数列表和其他元信息。为此,您可以使用:

(def some-var "With a docstring" 1)
(meta (var some-var)) ;; or
(meta #'some-var)
我最常将此reader宏与Stuart Sierra的组件库结合使用

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

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


FWIW大多数clojure开发人员在日常工作中不会接触这个reader宏,但绝对值得掌握。希望这有帮助

是的
#'x
扩展为
(var x)
,它计算的是var本身而不是它的值。在哪种具体情况下,我更愿意使用var而不是它的值?如果
x
有元数据,那么您可以使用
(meta#'x)
检索它<代码>alter var root也采用var,例如
(alter var root#n inc)