22

学习 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}

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

4

2 回答 2

26

它没有语法意义。它只是符号名称的一部分。在 Lisps 中,箭头->(甚至只是“>”)通常用于暗示将一种类型转换或强制转换为另一种类型。在 的宏展开中defrecord

(macroexpand '(defrecord Person [name age]))

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

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

将其与以下内容进行比较:

(let [f Person.]
  (f "Bob" 65))

这在语法上是无效的。

于 2012-08-21T03:58:49.393 回答
3

显然不是在您的具体示例中,但在一般情况下,此运算符->称为线程运算符,并被认为是画眉运算符之一。与它的表亲->>运算符一起,当您需要让代码更清晰地显示时,这些运算符非常有用,尤其是在将函数的输出作为参数提供给另一个函数时。两个运算符都是宏。这是关于这两个运营商 的另一篇SO 帖子。

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

这是另一种解释

于 2012-08-21T22:08:12.800 回答