[英]clojure.core: . operator, defmacro and setMacro
在defmacro
定義后查看 clojure.core 文件時,您會看到以下代碼:
(. (var defmacro) (setMacro))
這是什么意思?
的意思.
正如 Joost 和 Jeremy 的回答所解釋的那樣。 如果您想知道這個特定方法調用所完成的細節:
這基本上將一個名為:macro
true
鍵插入到名為clojure.core/defmacro
的 Var 的元數據 map 中。 這樣做的效果是,從現在開始,如果編譯器在解析為 var #'clojure.core/defmacro
的上下文中遇到符號defmacro
( #'foo
是(var foo)
的簡寫)——這將通常無處不在,盡管您可以使用let
綁定的局部變量來遮蔽這個 Var —— 它會知道它應該在宏名稱的情況下將其視為適當的。
(也就是說,(1)如果符號defmacro
出現在運算符 position 中,則使用綁定到#'clojure.core/defmacro
的 function 擴展宏調用,即緊接在左括號的右側,或者拋出一個抱怨非操作員 position 中提到的宏名稱的例外。)
順便說一句,Clojure 編譯器通常會在 Vars 上使用這種元數據映射,例如決定各種對象的類型(參見:tag
元數據)或是否內聯 function 調用(IIRC、 :inline
和:inline-arities
)。
我會分解整條線,因為我不知道你已經知道了什么。
首先, var
的文檔說:
該符號必須解析為 var,並返回 Var object 本身(不是它的值)。
如果我們將其輸入到 REPL 中,我們會得到:
user=> (var defmarco)
#'clojure.core/defmacro
現在, .
特殊形式允許您在 Java 對象的實例上調用方法。 在這種情況下,正在調用返回的Var
object 上的setMacro
方法。
我對代碼不夠熟悉,無法真正理解setMacro
在做什么,但我認為它正在改變 var 的 state 以說它是一個宏,而不是 function 或其他東西。
(.foo (bar)) 是 (.bar foo) 的低級等價物,因此它在沒有 arguments 的 defmacro var 上調用方法 setMacro。
我懷疑這個調用將 defmacro 函數/var 標記為宏。 一般來說,clojure.core 中的很多東西都使用低級技巧來引導語言,所以雖然看看東西是如何構建的很有趣,但它並不是一個很好的慣用代碼來源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.