在clojure中,名字中的前导箭头是什么意思
在学习Clojure时,我遇到了如下代码:在clojure中,名字中的前导箭头是什么意思,clojure,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} 问题是,->Person中的引导箭头(即->)是什么意思?是读卡器宏还是什么?我在clojuredoc的
=> (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的读者部分没有看到对它的描述。此外,人与人之间的区别是什么 它没有语法意义。它只是符号名称的一部分。在Lisps中,箭头
->
(甚至只是“>”)通常用于表示将一种类型转换或强制转换为另一种类型。在defrecord
的宏展开中:
(macroexpand '(defrecord Person [name age]))
您可以看到,它将->Person
定义为调用Person
构造函数的函数->Person(函数)可能比Person(对Java构造函数的直接调用)更便于您使用,因为您可以将其作为参数传递给其他函数,在变量中捕获并使用它,等等:
(let [f ->Person]
(f "Bob" 65))
与之相比:
(let [f Person.]
(f "Bob" 65))
这在语法上是无效的。显然不是在您的特定示例中,但在一般上下文中,此运算符->
称为,并被视为画眉运算符之一。除了它的表亲->
操作符外,当您需要更清晰地显示代码时,这些操作符非常有用,特别是当将函数的输出作为参数提供给另一个函数时。这两个操作符都是宏。这是另一个关于两个操作符的问题
我还没有理由使用->
,但确实需要->
来理解需要计算中间值并将它们全部放入一个函数调用中的代码
下面是另一个。您提到的lisp中的箭头背景更容易理解。有时,一段背景知识对读者的帮助远不止一堆技术描述。ThanksHow会使用map->Person
“x->y”来自方案命名约定。可以把它看作是“转换为”的简写。将一种类型的对象转换为另一种类型的对象的过程的名称写为type1->type2,例如vector->list