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

2024-03-29

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

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


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

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

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

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

比较一下:

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

这在语法上是无效的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

名称中的前导箭头在 clojure 中意味着什么 的相关文章

随机推荐