Clojure применить против карты

Я попытался удалить / установить, и это не сработало. Я запускаю OSX 10.10.3 с Android Studio 1.2.1.1 на JDK 1.8.0_45-b14, и решение, которое я нашел для работы, похоже на рекомендацию Хорхе Касариго. В принципе, из коробки вы получаете ошибку сборки для отсутствующего модуля «aidl», поэтому простое изменение версии Build Tools Version не должно быть версией 23.0.0. Rc1 решит вашу проблему. У него, похоже, есть ошибка.

UPDATE После комментирования проблемы с Android на своем трекере ( https://code.google.com/p/android/issues/detail?id=175080 ) участник проекта из группы Android Tools отметил, что для использования версии Build Tools версии 23.0.0 rc1 вам необходимо использовать Android Gradle Plugin 1.3.0-beta1 (Android Studio настроена с использованием 1.2.3). Он также отметил (прочитайте комментарии к проблеме), что IDE должна была дать уведомление, что вам нужно сделать это, чтобы он работал. Для меня я не видел уведомления, и я запросил разъяснения у этого участника проекта. Тем не менее его руководство решило проблему так, чтобы ее можно было прочитать.

Решение. Откройте свой build.gradle для своего проекта (а не модуля). Найдите строку classpath com.android.tools.build:gradle:xxx в разделе dependencies, где xxx - версия Gradle Plugin и сделайте обновление. Сохраните и перестройте свой проект. Вот документы Android Gradle для управления версиями Gradle: https://developer.android.com/tools/revisions/gradle-plugin.html

30
задан James Massey 22 February 2010 в 14:39
поделиться

2 ответа

Это будет функционировать, но это может быть не плохой идеей начать думать об альтернативах.

getYear устарел по причине; год, связанный с датой, фактически зависит от языка и как таковой был перемещен в класс Calendar. Это изменение класса Date, которое извлекает зависимость Locale из самих данных, также отображается в других функциональных возможностях, связанных с Date/Calendar. Поэтому при необходимости можно переходить к календарям.

То есть, я бы не прикасался к датам/календарям Java палкой, я предпочитаю вещи, такие как Apache Commons Lang и другие, чтобы иметь дело с большинством связанных с датой/временем вещей. Я также слышал, что Йода популярна в этом отношении.

-121--4293652-

Во-первых, компилятор и сам CPU уже агрессивно переупорядочивают инструкции, чтобы максимально использовать ILP. Скорее всего, они делают это лучше, чем ты когда-либо мог.

Однако есть несколько областей, где человек может помочь процессу.

Компилятор обычно очень консервативен в переупорядочивании вычислений с плавающей запятой, потому что он может немного изменить результат. Так, например, если предположить, что этот код:

float f, g, h, i;
float j = f + g + h + i;

вы, вероятно, получите нулевой ILP, потому что написанный код оценивается как ((f + g) + h) + i : результат первого сложения используется как операнд для следующего, результат которого используется как операнд в окончательном сложении. Никакие два дополнения не могут выполняться параллельно.

Если вместо этого записать его как float j = (f + g) + (h + i) , ЦП сможет выполнять f + g и h + i параллельно. Они не зависят друг от друга.

Как правило, предотвращение ILP - это зависимости. Иногда они являются прямыми зависимостями между арифметическими инструкциями, как описано выше, а иногда - зависимостями хранения/загрузки.

Для выполнения операций загрузки и хранения требуется много времени по сравнению с операциями в регистре, и операции, зависящие от них, должны ждать завершения операции загрузки/хранения.

Таким образом, сохранение данных во временных записях, которые компилятор может кэшировать в регистрах, иногда можно использовать, чтобы избежать доступа к памяти. Аналогично, запуск нагрузок как можно скорее также помогает избежать их задержки от блокирования следующих операций.

Лучший метод - внимательно изучить код и проработать цепочки зависимостей. Каждая последовательность операций, каждая из которых зависит от результата предыдущей, представляет собой цепочку зависимостей, которые никогда не могут выполняться параллельно. Можно ли каким-то образом разорвать эту цепь? Возможно, путем сохранения значения во временном или, возможно, путем повторного вычисления значения вместо ожидания загрузки кэшированной версии из памяти. Возможно, просто поместив несколько скобок, как в исходном примере с плавающей запятой.

Когда зависимости отсутствуют, CPU планирует параллельное выполнение операций.Все, что нужно сделать, чтобы использовать ILP, это разорвать длинные цепочки зависимостей.

Конечно, это проще сказать, чем сделать...:)

Но если вы проведете некоторое время с профилировщиком и изучите выходные данные сборки от компилятора, вы можете иногда получить впечатляющее ускорение от ручной оптимизации кода, чтобы лучше использовать ILP.

-121--3286535-

Скорее всего, вас поражает лень карты . ( map создает ленивую последовательность, которая реализуется только тогда, когда какой-либо код фактически использует свои элементы. И даже тогда реализация происходит в кусках, так что вы должны пройти всю последовательность, чтобы убедиться, что все это осознано.) Попробуйте обернуть выражение map в dorun :

(dorun (map println foundApps))

Также, поскольку вы делаете это только для побочных эффектов, может быть чище использовать doseq вместо этого:

(doseq [fa foundApps]
  (println fa))

Обратите внимание, что (map println foundApps) должны работать просто хорошо в REPL; Полагаю, вы извлекли его откуда-то в коде, где его не заставляют. Нет такой разницы с doseq , которая является строгой (то есть не ленивой) и будет ходить свои последовательности аргументов для вас при любых обстоятельствах. Также следует отметить, что doseq возвращает nil в качестве его значения; Это полезно только для побочных эффектов. Наконец, я пропустил отдых из вашего кода; возможно, вы имели в виду (rest foundApps) (если это не опечатка).

Также обратите внимание, что (применить println foundApps) будет печатать все foundApps на одной строке, в то время как (dorun (map println foundApps)) будет печатать каждого члена foundApps на своей собственной строке.

33
ответ дан 27 November 2019 в 23:39
поделиться

Небольшое объяснение может помочь. В общем случае вы используете apply, чтобы разделить последовательность элементов на набор аргументов функции. Таким образом, применение функции к некоторым аргументам означает передачу их в качестве аргументов функции в одном вызове функции.

Функция map сделает то, что вы хотите: создаст новый seq, подключая каждый элемент входного потока к функции, а затем сохраняя выход. Однако она делает это лениво, поэтому значения будут вычисляться только тогда, когда вы действительно выполняете итерацию по списку. Чтобы заставить это сделать, вы можете использовать функцию (doall my-seq), но в большинстве случаев вам это не понадобится.

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

Итак, чтобы добавить "foo" ко всем вашим приложениям (предполагается, что они являются строками):

(map (fn [app] (str app "foo")) found-apps)

или используя shorhand для анонимной функции:

(map #(str % "foo") found-apps)

То же самое, но с немедленной печатью, можно сделать с помощью одного из этих методов:

(doall (map #(println %) found-apps))

(doseq [app found-apps] (println app))

8
ответ дан 27 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: