Что означает главная стрелка в названии в 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. Кроме того, в чем разница между → Person и Person.?
Ответы
Ответ 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))
Что является синтаксически недействительным.
Ответ 2
Очевидно, что не в вашем конкретном примере, но в общем контексте этот оператор ->
называется оператор потоковой передачи и считается одним из операторы молочницы. Наряду со своим кузеном оператор ->>
, эти операторы весьма полезны, когда вам нужно, чтобы код выглядел более четко, особенно при подаче вывода функций в качестве параметров в другую функцию. Оба оператора являются макросами. Вот еще один SO post относительно обоих операторов.
У меня еще не было причины использовать ->
, но мне понадобился ->>
, чтобы понять код, необходимый для вычисления промежуточных значений и поместить их в один вызов функции.
Вот еще пояснение.