2017-08-15 87 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的開發者不會在他們的日常工作接觸這個讀者宏,但絕對值得擁有的把握。希望這有助於!