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

Java для пользователей Clojure

Я использовал и использовал Lisp, и я догоняю clojure. Хорошая вещь о clojure заключается в том, что я могу использовать все функции java естественным образом, а плохая вещь о clojure также заключается в том, что я должен естественно знать java-функцию.

Например, мне пришлось потратить некоторое время (googling), чтобы найти квадратную функцию в Java (Math/sqrt в нотации clojure).

Не могли бы вы порекомендовать мне какой-нибудь хороший информационный ресурс для функций Java (библиотеки) для clojure пользователей, которые не знакомы с Java?

Это может быть что угодно - хорошие книги, веб-страницы, форумы или что-то еще.

4b9b3361

Ответ 1

У меня были подобные проблемы, когда я впервые начал использовать Clojure. Я несколько лет назад занимался разработкой Java, но до сих пор не знаком с библиотеками.

Введение

Я считаю, что самый простой способ использовать Java - это не использовать его. Я думаю, что книга будет немного больше, чтобы начать работу с Java с Clojure. Существует не так много, что вам действительно нужно знать, если вы действительно не начнете спускаться в библиотеки JVM/Java. Позвольте мне объяснить.

Потратьте больше времени на изучение использования Clojure внутри и снаружи и ознакомьтесь с Clojure -Contrib. Например, sqrt находится в generic.math-functions в Clojure.contrib.

Многие из вещей, которые вам понадобятся, на самом деле уже находятся в Clojure, но все же их нет.

Ознакомьтесь с соглашениями о вызовах и синтаксическим сахаром в Clojure для использования Java. например Math/sqrt, в соответствии с вашим примером, вызывает статический метод (который только функция, в основном) sqrt из класса Math.

В любом случае, вот руководство, которое должно помочь вам начать работу, если вам действительно нужно использовать Java. Я собираюсь предположить, что вы сделали какое-то обязательное программирование OO, но не намного больше. И даже если вы этого не сделали, вы должны быть в порядке.


Руководство по Java-программисту на Java

Классы

Класс - это набор методов (функций, действующих на класс), которые также может быть типом данных: например, для создания нового класса типа Double: (Double. 1.2), который инициализирует класс Double (период является синтаксическим сахаром для вызова методов конструктора класса, которые инициализируют класс со значениями, которые вы предоставляете) значением 1.2.

Теперь рассмотрим Double класс в Java 6 API:

Double

public Double(double value)

Constructs a newly allocated Double object that represents the 
primitive double argument.

Parameters:
value - the value to be represented by the Double.

Итак, вы можете видеть, что там произошло. Вы "построили" новый Double со значением 1.2, который является двойным. Немного смущает там, но на самом деле Double - это класс, который представляет Double и может делать вещи, связанные с удвоениями.

Статические методы

Например, чтобы разобрать двойное значение из строки, мы можем использовать статический метод (это означает, что нам не нужен конкретный экземпляр Double, мы можем просто называть его, как мы назвали sqrt) parseDouble(String s):

(Double/parseDouble "1.2") => 1.2

Не сложно это сделать.

Нестационарные методы

Предположим, мы хотим использовать класс Java, который мы инициализировали. Не слишком сложно:

(-> (String. "Hey there") ;; make a new String object
    (.toUpperCase)) ;; pass it to .toUpperCase (look up -> to see what it does)
                    ;; toUpperCase is a non-static method

=> "HEY THERE"

Итак, теперь мы использовали метод, который не является статичным, и для которого требуется реальный объект live String. Давайте посмотрим, как говорят документы:

toUpperCase

public String toUpperCase()

Converts all of the characters in this String to upper case using 
the rules of the default locale. This method is equivalent to
toUpperCase(Locale.getDefault()).

Returns:
the String, converted to uppercase.

Итак, у нас есть метод, который возвращает строку (как показано "String" после публики в определении и не принимает никаких параметров. Но подождите, это займет параметр. В Python это будет неявный параметр self: это называется this в Java.

Мы могли бы также использовать следующий метод: (.toUpper (String. "Hey there")) и получить тот же результат.

Подробнее о методах

Поскольку вы имеете дело с изменяемыми данными и классами в Java, вы должны иметь возможность применять функции к классам (экземпляры классов, действительно) и не ожидать возвратного значения.

Например, скажем, что мы имеем дело с JFrame из библиотеки javax.swing. Нам может понадобиться сделать несколько вещей, а не с ним (вы обычно работаете со значениями, а не на них в функциональных языках). Мы можем, например:

(doto (JFrame. "My Frame!");; clever name
   (.setContentPane ... here we'd add a JPanel or something to the JFrame)
   (.pack) ;; this simply arranges the stuff in the frame–don't worry about it
   (.setVisibleTrue)) ;; this makes the Frame visible 

doto просто передает свой первый аргумент всем другим функциям, которые вы ему поставляете, и передает его в качестве первого аргумента для них. Итак, здесь мы просто делаем много вещей для JFrame, которые не возвращают ничего в частности. Все эти методы перечислены в качестве методов JFrame в документации (или ее суперклассах... пока не беспокойтесь о них).

Завершение

Это должно подготовить вас к изучению the JavaDocs самостоятельно. Здесь вы найдете все, что доступно вам в стандартной версии Java 1.6. Появятся новые концепции, но быстрый поиск в Google должен отвечать на большинство ваших вопросов, и вы всегда можете вернуться сюда с конкретными.

Обязательно загляните в другие важные функции Clojure, такие как proxy и reify, а также extend-type и его друзья. Я не часто их использую, но когда мне это нужно, они могут быть неоценимы. Я по-прежнему понимаю их сам.

Там тонна, но это в основном проблема объема, а не сложности. Это не плохая проблема.

Дополнительное чтение:

Ответ 2

Мой первый вопрос: что вам нужно? Там много Java-библиотек. Или вам нужны только стандартные библиотеки? В этом случае ответа, полученного dbyrne, должно быть достаточно.

Имейте в виду, что в целом вам лучше использовать структуры данных Clojure, такие как последовательности вместо эквивалентов Java.

Ответ 3

Действительно, любая хорошая книга Java может помочь вам начать работу. См. Например, ответ на вопрос о лучшие пользователи Java-книги уже прочитали. Там есть много хороших источников.

Как только у вас есть маленькая Java под вашим поясом, использование этого всего лишь вопрос простого синтаксиса Clojure.

Освоение содержимого объемных библиотек Java - гораздо более сложная задача, чем выяснение того, как их использовать в Clojure.

Ответ 4

Начните с Sun (теперь Oracle) Учебники по Java: http://download.oracle.com/javase/tutorial/index.html

Затем погрузитесь в документы API Java 6: http://download-llnw.oracle.com/javase/6/docs/

Затем задайте вопросы по # clojure IRC или списку рассылки и прочитайте блоги.

Для глубокого погружения в Java язык я рекомендую Брюсу Эккелу бесплатно "Мышление в Java": http://www.mindview.net/Books/TIJ/

Ответ 5

Я думаю, что простой старый Java 6 Спецификация API должна быть в значительной степени все, что вам нужно.