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

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

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

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

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

14
задан prosseek 27 August 2013 в 16:47
поделиться

5 ответов

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

Введение

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

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

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

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

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


Руководство Исаака Clojurist по 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 и его друзья. Я не часто ими пользуюсь, но когда мне нужно, они могут оказаться бесценными. Собственно, я до сих пор их понимаю.

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

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

29
ответ дан 1 December 2019 в 07:38
поделиться

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

0
ответ дан 1 December 2019 в 07:38
поделиться

Начните с 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/

2
ответ дан 1 December 2019 в 07:38
поделиться

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

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

2
ответ дан 1 December 2019 в 07:38
поделиться

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

Если у вас есть немного Java за плечами, использование этого просто вопрос простого синтаксиса Clojure.

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

2
ответ дан 1 December 2019 в 07:38
поделиться
Другие вопросы по тегам:

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