学习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。 之间有什么区别?
答案 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。