Подтвердить что ты не робот

Что означает главная стрелка в названии в 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.?

4b9b3361

Ответ 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 относительно обоих операторов.

У меня еще не было причины использовать ->, но мне понадобился ->>, чтобы понять код, необходимый для вычисления промежуточных значений и поместить их в один вызов функции.

Вот еще пояснение.