2011-04-21 32 views

回答

10

簡而言之,閱讀器宏爲您提供了在某些分隔上下文中重新定義編程語言的語法的能力。

例如,您可以使用給定的閱讀器宏來實現正則表達式文本(例如#"pattern")。沒有它們,你將被迫正確地轉義傳遞給re-pattern的字符串文字中的正則表達式。

順便說一句,雖然沒有公開的Clojure API進行修改的讀者,這不是不可能的,因爲在這些職位說明:

8

一個簡單的例子。 Common Lisp爲矢量#()而不是[]提供了不同的閱讀器語法。但是,通過創建自定義閱讀器宏的功能,您可以擁有一個閱讀器宏,它也可以將Common Lisp中的矢量[2 3 4 5]轉換爲Common Lisp。

由於大多數用戶不會意識到讀者宏的含義,他們很少使用,爲了避免混淆,Rich Hickey決定取消在Clojure中擁有用戶定義讀者宏的能力。然而,Clojure具有預定義的閱讀器宏 - 報價,矢量,正則表達式,地圖等。

6

Common Lisp中的閱讀器是用戶可擴展的閱讀器宏。 閱讀器負責閱讀s表達式S-表達是Lisp的數據類型,如數字,字符串,符號列表,conses之外,結構,數組,字符,外部文本語法...

讀者是不負責的語法編程語言Lisp - 僅用於s表達式

因此,從用戶的角度來說,讀者宏的主要目的是擴展或改變s表達式的語法。例如,用戶可以爲各種CLOS類(如URL,...),散列表,特殊標識符,新數字類型添加文本語法...

有時它也用於嵌入其他語言的語法/語法,它們有不同的規則來形成令牌:嵌入式SQL,嵌入式C,中綴表達式,對Objective C的嵌入式調用,嵌入式規則語言,嵌入式XML,嵌入式JSON等等。

另一個用途是允許用戶對s表達式有額外的控制權,讀者實際上讀取。例如條件特徵表達式。

因此,用戶可編程閱讀器宏允許用戶根據上述功能定製閱讀器。可以想象,這對那些想要在數據語法/令牌級別定製語言的用戶很有用,但是它增加了另一層複雜性。