2013-05-04 68 views
2

試圖創建一個Haskell的lambda語法的宏形式,除了最後一個調整之外,我非常接近,/(應該是\,但不能抱怨。 。)在它旁邊需要一個空格,是否有任何方法可以使它成爲我的宏,它不需要它和第一個參數之間的空格?不需要空間旁邊的Clojure宏

例如:

(reduce (/x y -> x y) [1 2 3])

代替:肯定知道

(reduce (/ x y -> x y) [1 2 3])

我懷疑這是不可能的,但唯一的辦法是問,誰知道的人,那麼這個詞是什麼?

回答

5

編號宏不能改變語言的詞法語法。這需要Clojure沒有的讀取宏。

+3

爲了澄清一下,Clojure確實有讀者宏(''','#(...)'是例子),但是,不像其他Lisps,它不會讓你自己創建。 – JohnJ 2013-05-04 23:50:16

2

不,但如果你想做更宏大的事情,你可以定義另一個宏來包裝你的整個命名空間。這個宏可以查看它下面的所有表單,例如用tree-seq查找符號代替表格/x,並用/ x代替它們。

+0

可以這樣做嗎?迴避之前,你迴避它是clojure不支持的東西.. – 2013-05-04 20:57:26

+2

有一個宏回聲它的身體作爲其擴展應用了一定的調整(如某些形式的符號被其他值取代)是完全可行的,並沒有涉及語言表面語法的任何變化。正如它發生的那樣,'/ foo'在Clojure中不是一個有效的符號,所以這仍然不起作用。另一方面,你可以嘗試使用實際的λ字符。如果禁止所有其他用途,這實際上會相當簡單(圍繞元數據等易於處理的複雜問題)。 – 2013-05-04 22:02:02

+0

NB。禁止λ字符的其他用途(至少作爲符號名稱中的第一個字符)很重要,就好像你不願意那樣做,你必須能夠確定一個給定的符號是以它應該被替換或者不被替換,這對於一組開放的特殊結構(宏)是完全不可能的。 – 2013-05-04 22:06:09