学习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)
这在语法上是无效的.