#clojure
#clojure
Вопрос:
Я пытаюсь использовать longs
функцию, но она не работает:
(println (longs 1 2 3))
Есть примеры?
Описание на сайте не очень хорошее, поэтому у меня проблемы http://clojure.org/cheatsheet
Спасибо
Комментарии:
1. Чего вы ожидаете, что вы получаете и почему вам это не нравится?
Ответ №1:
Ваш вопрос, к сожалению, неполный, но я все равно попробую его.
В документации для longs
говорится:
Использование: (длинные xs)
Это означает, что он ожидает один аргумент (названный xs
в этом примере). Вы передаете ему три аргумента.
Документация для longs
продолжается таким образом:
Приводит к
long[]
Приведение означает: оно не изменяет xs, оно просто проверяет, что это массив примитивов long
, а затем делает эту информацию доступной компилятору. По сути, перенос выражения, которое создает long[]
in (longs ...)
, является подсказкой типа для Clojure, так что ему не нужно использовать отражение во время выполнения для разрешения вызова метода с использованием этого значения в качестве аргумента:
// Suppose we have a java class
class JavaClass {
static long[] getSomeLongs() { ... }
static long sum(long[] numbers) { ... }
static float sum(float[] numbers) { ... }
}
;; And this Clojure code:
(defn numbers [] (JavaClass/getSomeLongs))
(JavaClass/sum (numbers))
Clojure динамически типизируется, поэтому, когда он компилирует вторую строку, он не будет знать, что (numbers) возвращает массив long . Ему придется подождать до времени выполнения, а затем найти правильный метод JavaClass / sum с использованием отражения. Это дорого.
Решение состоит в том, чтобы дать компилятору Clojure подсказку о типе (numbers) . Таким образом, он может выбрать правильный метод для вызова во время компиляции, что приведет к более быстрому запуску программы:
(JavaClass/sum (longs (numbers)))
Но, судя по вашему крайне неполному вопросу, это, вероятно, не то, чего вы ожидали, когда достигли longs
. Кажется, вы надеялись, что это создаст массив длинных значений из приведенных вами аргументов. Если это то, что вы хотите, тогда используйте это:
(into-array Long/TYPE [1 2 3])
Но вы, вероятно, будете разочарованы результатами его печати:
user=> (println (into-array Long/TYPE [1 2 3]))
#<long[] [J@2321b59a>
Это то, что выдает Java, когда вы просите ее преобразовать массив в строку, так что это то, что печатает Clojure. Если вы хотите, чтобы содержимое массива было распечатано обратно, вам нужно создать последовательность:
user=> (println (seq (into-array Long/TYPE [1 2 3])))
(1 2 3)