2017-05-22 36 views

回答

5

讀者宏改變語言的語法(例如,@foo變成(deref foo)),通常的宏不能這樣做(一個普通的宏將無法擺脫括號,所以你會有做一些像(@ foo))。它被稱爲讀取器宏,因爲它在repl的read傳遞中執行(檢出source)。作爲一個clojure開發者,你只會創建常規的宏,但是你將會使用大量的宏讀取器,而不必明確地考慮它們。

讀者宏的完整列表在這裏:https://clojure.org/reference/reader和包括像@',並#{}共同的東西。

Clojure的(不像其他一些的Lisp)不支持用戶定義的讀者宏,但有一些擴展經由tagged literals(例如#inst#uuid

3

TL內置到閱讀器;博士*

宏[正常宏]評價(REPL的E)期間被擴展,捆綁到碼元,對口齒不清對象進行操作,並且出現在第一或「功能」,一種形式的一部分。 Clojure和所有lisp都允許定義新的宏。在評價之前在讀取期間運行

讀卡器宏,是單個字符,對字符串操作之前,所有從讀取器發射的口齒不清對象,並且不限於在第一或「功能」是,是表單的一部分。 Clojure的,不像一些其他的Lisp,不允許定義新的讀者宏,編輯短Clojure的編譯器本身。

更多的話:

正常的非讀者宏,或只是「宏」,操作上口齒不清的對象。考慮:

(and 1 b :x)

and的宏將與兩個值被調用,一個值是1,另一個是由符號b(未b的值)和關鍵字:x的列表。宏正在處理的所有and已經是lisp(Clojure)值。

宏擴展僅在宏是在列表的開始發生。 (and 1 2)擴展and宏。 (list and)返回錯誤「無法獲取宏的值」

讀者重新負責將字符串轉換爲In Clojure讀者宏是一個單獨的字符,它改變了讀者,負責轉向的部分文本流成口齒不清對象,進行操作。Clojure的lisp閱讀器的發送是LispReader.java。正如Alejandro C.所述,Clojure不支持添加閱讀器宏。

閱讀器宏是一個字符。 (我不知道這是否適用於所有lisps,但Clojure目前的實現僅支持單字符閱讀器宏。)

閱讀器宏可以存在於窗體中的任何位置。考慮(conj [] 'a)如果'宏是正常的,則tick將需要變成lisp對象,所以代碼將是符號conj,空向量,符號'以及最後符號a的列表。但是現在的規則要求自己評估'。取而代之的是,讀者在看到'包裝完整的s-exp後跟quote,以便返回給評估者的值是conj,一個空向量和一個quote後跟a的列表。現在quote是列表的頭,並且可以更改它引用內容的評估規則。

1

簡而言之,讀者宏是一個低級特徵。這就是爲什麼有這麼幾個(只是@,退出和更多)。必須遵守許多讀者規則才能將任何語言變成一團糟。

一個常規宏是一個在Clojure中廣泛使用的工具。作爲開發人員,如果您不是Clojure的核心開發人員,歡迎您編寫自己的常規宏而不是讀者宏。

您可能總是使用您自己的標籤文字作爲讀者規則的替代,例如#inst "2017"會給你一個Date實例等等。

相關問題