回答
讀者宏改變語言的語法(例如,@foo
變成(deref foo)
),通常的宏不能這樣做(一個普通的宏將無法擺脫括號,所以你會有做一些像(@ foo)
)。它被稱爲讀取器宏,因爲它在repl的read
傳遞中執行(檢出source)。作爲一個clojure開發者,你只會創建常規的宏,但是你將會使用大量的宏讀取器,而不必明確地考慮它們。
讀者宏的完整列表在這裏:https://clojure.org/reference/reader和包括像@
'
,並#{}
共同的東西。
Clojure的(不像其他一些的Lisp)不支持用戶定義的讀者宏,但有一些擴展經由tagged literals(例如#inst
或#uuid
)
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
是列表的頭,並且可以更改它引用內容的評估規則。
簡而言之,讀者宏是一個低級特徵。這就是爲什麼有這麼幾個(只是@
,退出和更多)。必須遵守許多讀者規則才能將任何語言變成一團糟。
一個常規宏是一個在Clojure中廣泛使用的工具。作爲開發人員,如果您不是Clojure的核心開發人員,歡迎您編寫自己的常規宏而不是讀者宏。
您可能總是使用您自己的標籤文字作爲讀者規則的替代,例如#inst "2017"
會給你一個Date
實例等等。
- 1. typedef和宏之間有什麼區別?
- 2. Java中的流和讀者之間有什麼區別?
- 3. valgrind和常規C++運行之間有什麼區別
- 4. Jar簽名者和Apk簽名者之間有什麼區別?
- 5. object_id和常規ID之間的區別
- 6. 宏_MANAGED和_cplusplus_cli之間有什麼區別?
- 7. _T(「...」)和_RT(「...」)宏之間有什麼區別?
- 8. 加載項和宏之間有什麼區別?
- 9. 「層」和「層」之間有什麼區別?
- 10. Tableau和QlikView之間有什麼區別
- 11. Microsoft.CompilerServices.AsyncTargetingPack和Microsoft.Bcl.Async之間有什麼區別?
- 12. @Entity和@embeddable之間有什麼區別
- 13. ContentObservable和DataSetObservable之間有什麼區別?
- 14. touchmove和gesturechange之間有什麼區別?
- 15. :notification.flags和notification.defaults之間有什麼區別?
- 16. proc和lambda之間有什麼區別?
- 17. :: after和after之間有什麼區別?
- 18. read()和io.read()之間有什麼區別?
- 19. Request()和Request.Form()之間有什麼區別?
- 20. WebServiceBinding.EmitConformanceClaims和WebServiceBinding.ConformanceClaims之間有什麼區別?
- 21. getA()和this.getA()之間有什麼區別?
- 22. (int)和intval()之間有什麼區別?
- 23. set_value和= pandas之間有什麼區別
- 24. * zoom和zoom之間有什麼區別?
- 25. {0}和「」之間有什麼區別?
- 26. typedef和using之間有什麼區別?
- 27. 「」和「'之間有什麼區別?
- 28. STDIN和tty之間有什麼區別?
- 29. +和%之間有什麼區別?
- 30. sysfs_create_file()和sysfs_create_group()之間有什麼區別?