名称中的前导箭头在clojure中意味着什么

时间:2012-08-21 03:41:12

标签: clojure

学习Clojure我遇到了如下代码:

=> (defrecord Person [name, age])
user.Person
=> (->Person "john" 40)
#user.Person{:name "john", :age 40}
=> (Person. "tom" 30)
#user.Person{:name "tom", :age 30}

问题是, - &gt; Person <中的前导箭头(即 - &gt; )是什么? / strong>是什么意思?这是一个读者宏还是什么?我在clojuredoc的阅读器部分看不到它的描述。此外, - &gt; Person Person。 之间有什么区别?

2 个答案:

答案 0 :(得分:24)

它没有句法意义。它只是符号名称的一部分。在Lisps中,箭头->(或者甚至只是'&gt;')通常用于暗示将一种类型转换或转换为另一种类型。在defrecord

的宏扩展中
(macroexpand '(defrecord Person [name age]))

你可以看到它将->Person定义为调用Person构造函数的函数。使用->Person(函数)可能比Person.(直接调用Java构造函数)更方便,因为您可以将其作为参数传递给其他函数,将其捕获到变量中使用它等:

(let [f ->Person]
  (f "Bob" 65))

将其与:

进行比较
(let [f Person.]
  (f "Bob" 65))

语法无效。

答案 1 :(得分:2)

显然不在您的具体示例中,但在一般上下文中,此运算符->被称为threading operator,并被视为鹅口疮运算符之一。与它的堂兄->>运算符一起,当你需要让代码更清晰时,这些运算符非常有用,特别是在将函数输出作为参数提供给另一个函数时。两个运算符都是宏。这是关于两个运营商的另一个SO post

我还没有理由使用->,但确实需要->>来理解计算中间值所需的代码并将它们全部放入一个函数调用中。

这是另一个explanation