簡體   English   中英

clojure.核心:。 運算符、defmacro 和 setMacro

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM