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

Joh*_*ang 20 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}
Run Code Online (Sandbox Code Playgroud)

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

Kyl*_*ton 24

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

(macroexpand '(defrecord Person [name age]))
Run Code Online (Sandbox Code Playgroud)

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

(let [f ->Person]
  (f "Bob" 65))
Run Code Online (Sandbox Code Playgroud)

比较一下:

(let [f Person.]
  (f "Bob" 65))
Run Code Online (Sandbox Code Playgroud)

这在语法上是无效的.

  • “x->y”来自Scheme 命名约定。将其视为“转换为”的简写。http://www.scheme.com/tspl2d/intro.html “将一种类型的对象转换为另一种类型的对象的过程名称写为 type1->type2,例如,vector->list。” (3认同)

oct*_*bus 5

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

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

这是另一种解释