在clojure中#和%的名称是什么?

时间:2012-04-07 14:26:37

标签: clojure

clojure中的构造名称是什么,在表达式的开头使用#在中间?例如

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

我已经尝试在文档中搜索它,但由于定义它的两个字符都不是字母数字,我的搜索并不太成功。

4 个答案:

答案 0 :(得分:8)

它是匿名函数声明的读者宏。有关阅读器宏的完整列表,请参阅http://clojure.org/reader

例如,#(* 5 %)会转换为(fn [x] (* 5 x))

您的示例将阅读阶段转换为(fn [op] (fn [a b] (op a b)))op是我选择的占位符。)

答案 1 :(得分:6)

它出现在(至少)两个地方:

  1. Other Useful Functions and Macros下(但未提及%1%2等)。

  2. Reader(解析程序)中 - #导致通过表查找调度到读取器宏(您必须仔细查看,但这确实描述了%1等)

  3. 在两种情况下它都没有有用的名称(实际上,“Dispatch”可能是隐含的名称 - 请参阅第二个链接)。更常见的是“#”被称为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
    

答案 2 :(得分:2)

#()构造是匿名函数定义的简写。 %符号用作参数的简写。

第一个参数的

%。多个参数的%整数(即%1%2)。 %安培;对于包含在序列中的其余(未使用的)参数。

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

您可以通过在其上执行宏扩展来查看它创建的函数

#((\ %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))

请注意,您的示例会创建一个匿名函数,其中包含一个新的匿名函数。

答案 3 :(得分:1)

“#”应为lambda字符,%表示预期的第一个参数

相关问题