Longs Functiooon Cloj - PullRequest
       0

Longs Functiooon Cloj

0 голосов
/ 10 октября 2011

Я пытаюсь использовать функцию longs, но она не работает:

(println (longs 1 2 3))

Какие-нибудь примеры?

Описание на сайте не очень хорошее, поэтому у меня проблемы http://clojure.org/cheatsheet

Спасибо

1 Ответ

5 голосов
/ 10 октября 2011

Ваш вопрос ужасно неполный, но я все равно попробую.

Документация для longs гласит:

Использование: (longs xs)

Это означает, что он ожидает один аргумент (в данном примере с именем xs). Вы передаете это три аргумента.

Документация для longs продолжается так:

Приводит к long[]

Приведение означает: он не меняет xs, он просто проверяет, является ли он массивом примитива long, а затем делает эту информацию доступной для компилятора. По сути, перенос выражения, которое создает long[] в (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 подсказку о типе (числа). Таким образом, он может выбрать правильный метод для вызова во время компиляции, что приведет к более быстрой работе программы:

(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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...