Java для пользователей Clojure - PullRequest
14 голосов
/ 19 августа 2010

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

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

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

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

Ответы [ 5 ]

29 голосов
/ 19 августа 2010

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

Введение

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

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

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

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

В любом случае, вот руководство, которое должно помочь вам начать работу, если вы обнаружите, что действительно нуждается в использовании 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.

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

Например, для анализа значения 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"

Итак, теперь мы использовали метод, который не является статичным, и для которого требуется настоящий, живой 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» после public в определении и не принимает параметров. Но подождите! Он принимает параметр. В Python это будет неявный параметр self: в Java он называется this.

Мы также могли бы использовать метод, подобный этому: (.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 (или его суперклассы… пока не беспокойтесь о них).

Завершение

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

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

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

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

2 голосов
/ 20 августа 2010

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

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

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

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

2 голосов
/ 19 августа 2010

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

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

2 голосов
/ 19 августа 2010

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

Если у вас есть немного Java под вашим поясом, то использовать его - просто вопрос простого синтаксиса Clojure.это гораздо большая задача, чем выяснить, как использовать их в Clojure.

0 голосов
/ 19 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...