2012-04-07 46 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)) 

要小心,要注意的是你的榜样用一个新的匿名函数创建一个匿名函数。