【问题标题】:What does the leading arrow in a name mean in clojure名称中的前导箭头在clojure中是什么意思
【发布时间】:2012-08-21 03:41:11
【问题描述】:

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

【问题讨论】:

    标签: clojure


    【解决方案1】:

    它没有语法意义。它只是符号名称的一部分。在 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箭头的背景使它更容易理解。有时,一段背景比一堆技术描述更能帮助读者。谢谢
    • 如何使用map->Person
    • “x->y”来自一个方案命名约定。将其视为“转换为”的简写。 scheme.com/tspl2d/intro.html "将一种类型的对象转换为另一种类型的对象的过程名称写为 type1->type2,例如,vector->list。"
    【解决方案2】:

    显然不是在您的具体示例中,但在一般情况下,此运算符 -> 称为 threading operator 并被视为画眉运算符之一。连同其表亲 ->> 运算符一起,当您需要让代码更清晰地显示时,这些运算符非常有用,尤其是在将函数的输出作为参数提供给另一个函数时。两个运算符都是宏。这是另一个关于两个运营商的SO post

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

    这是另一个explanation

    【讨论】:

      猜你喜欢
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      相关资源
      最近更新 更多