2012-04-07 36 views
2

clojure中構造的名稱是什麼?在表達式開始時使用#在中間使用%?例如clojure中#和%的名字是什麼?

#(fn [a b] (% b a)) 

我試圖尋找它而是將其定義它的非字母數字字符我的搜索並沒有太成功了兩個字符的文檔。

回答

8

它是匿名函數聲明的讀取器宏。請參閱http://clojure.org/reader以獲取閱讀器宏的完整列表。

例如,#(* 5 %)轉換爲(fn [x] (* 5 x))

你的示例轉換在讀階段(fn [op] (fn [a b] (op a b)))

6

它出現在(至少)兩個地方(op是我的選擇佔位符的存在。):

  1. Other Useful Functions and Macros(但沒有按」提及%1%2等)。

  2. Reader(這解析程序) - #原因通過查找表分發到讀者的宏(你一定要看仔細,但這並描述%1等)

在既不情況是否有一個有用的名稱(實際上,「調度」可能是隱含的名稱 - 請參閱第二個鏈接)。更一般地說,「#」被稱爲octothorp,其中包括(在智利這裏,「gato」(貓),原因不明)。 (是的,%1%2是第一個和第二個參數等,而%&是「休息」 - 你可以只使用%作爲第一個參閱第二個鏈接)。

PS正如其他人所說,它是一個函數的簡寫。所以(fn [a b] (+ a b))相當於#(+ %1 %2)

Clojure> (#(println % % %2) 1 2) 
1 1 2 
nil 
Clojure> (#(apply println %&) 1 2 3) 
1 2 3 
nil 
+0

%1和%2代表多個參數嗎? – 2012-04-07 14:38:17

+0

%1和%2分別代表第一和第二參數。 – user100464 2012-04-07 15:32:50

1

「#」應該是拉姆達的性格,%表示第一個參數預期

2

的#()建設是一個匿名函數的定義速記。 %符號用作所需參數的簡寫。

%第一個參數。 %多個參數的整數(即%1%2)。 %&其餘(未使用)參數包裝在一個序列中。

=> (#(println % %2 %3 %&) 1 2 3 4 5) 
1 2 3 (4 5) 

你可以看到什麼功能它創建由它做一個macroexpand

#((\ %1 %2) * %2)) 
=> (macroexpand-1 '#((\ %1 %2) * %2)) 
(fn* [p1__744# p2__745#] ((\space p1__744# p2__745#) * p2__745#)) 
正常的話以下

是相同的:

#((\ %1 %2) * %2)) 
    (fn [p1 p2] ((\ p1 p2) * p2)) 

要小心,要注意的是你的榜樣用一個新的匿名函數創建一個匿名函數。

相關問題