Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在clojure中,名字中的前导箭头是什么意思_Clojure - Fatal编程技术网

在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的

在学习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的读者部分没有看到对它的描述。此外,人与人之间的区别是什么

它没有语法意义。它只是符号名称的一部分。在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