долго работает над cloj

#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)