Я использую Lisp и выключаю, и я догоняю Clojure. Хорошая вещь о clojure заключается в том, что я могу использовать все Java-функции естественным образом, а плохая вещь о Clojure также заключается в том, что я должен знать Java-функцию естественным образом.
Например, мне пришлось потратить некоторое время (поиск в Google), чтобы найти квадратная функция в Java (Math / sqrt в нотации clojure).
Не могли бы вы порекомендовать какой-нибудь хороший информационный ресурс по функциям (библиотекам) Java для пользователей clojure, которые не очень знакомы с Java?
Это может быть что угодно - хорошо книги, веб-страницы, форумы или что-то еще.
У меня были похожие проблемы, когда я впервые начал использовать Clojure. Я занимался разработкой Java несколько лет назад, но все еще был довольно незнаком с библиотеками.
Я считаю, что самый простой способ использовать Java - это не на самом деле ее использовать. Я думаю, что книги было бы немного, чтобы просто начать использовать Java из Clojure. На самом деле вам не так много нужно знать, если вы действительно не начнете углубляться в библиотеки JVM / Java. Позволь мне объяснить.
Уделите больше времени изучению того, как использовать Clojure как внутри, так и снаружи, и познакомьтесь с Clojure-Contrib. Например, sqrt
находится в generic.math-functions в clojure.contrib.
Многие из вещей, которые вам понадобятся, на самом деле уже есть в Clojure, но их все еще нет.
Ознакомьтесь с соглашениями о вызовах и синтаксическим сахаром в Clojure для использования Java. например Math / sqrt
, согласно вашему примеру, вызывает статический метод (который, по сути, просто функция) sqrt
из класса Math
.
В любом случае, вот руководство, которое должно помочь вам начать работу, если вы действительно нуждаетесь в использовании 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
, мы можем просто вызвать это похоже на то, что мы назвали 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.
Итак, у нас есть метод, который возвращает строку (как показано в строке «Строка» после публичного в определении и не принимает никаких параметров. Но подождите! Это требует В Python это был бы неявный параметр self
: в Java он называется this
.
Мы также можем использовать такой метод: (. toUpper (String. "Привет"))
и получите тот же результат.
Поскольку вы имеете дело с изменяемыми данными и классами в 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
и его друзья. Я не часто ими пользуюсь, но когда мне нужно, они могут оказаться бесценными. Собственно, я до сих пор их понимаю.
Их очень много, но в основном это проблема объема, а не сложности. Это неплохая проблема.
Я думаю, старая добрая Java 6 Спецификация API должна быть почти всем, что вам нужно.
Начните с Sun (теперь Oracle) Руководства по Java: http://download.oracle.com/javase/tutorial/index.html
Затем погрузитесь в документацию по Java 6 API: http://download-llnw.oracle.com/javase/6/docs/
Затем задавайте вопросы по #clojure IRC или списку рассылки и читайте блоги.
Для более глубокого погружения в язык Java я рекомендую бесплатную Thinking in Java Брюса Эккеля: http://www.mindview.net/Books/TIJ/
Мой первый вопрос: что именно вам нужно? Существует множество библиотек Java. Или вам нужны только стандартные библиотеки? В таком случае ответа, данного dbyrne, должно быть достаточно.
Имейте в виду, что в общем случае лучше использовать структуры данных Clojure, такие как последовательности, а не эквиваленты Java.
На самом деле, любая хорошая книга по Java может помочь вам начать работу. См. Например ответ на вопрос о лучшая книга по Java, которую люди прочитали на данный момент . Там много хороших источников.
Если у вас есть немного Java за плечами, использование этого просто вопрос простого синтаксиса Clojure.
Освоение содержимого обширных библиотек Java - гораздо более сложная задача, чем выяснение того, как их использовать в Clojure.