Отсутствуют библиотеки Clojure (поэтому используйте Java) ...? - PullRequest
2 голосов
/ 30 июня 2011

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

Ответы [ 6 ]

1 голос
/ 30 июня 2011

Я настоятельно предпочитаю Clojure как язык для разработки в целом, но есть несколько веских причин, по которым я нашел использование библиотек Java или написание кода Java по сравнению с Clojure:

  • Использование зрелых библиотек Java - некоторые библиотеки Java действительно превосходны и очень зрелы. С прагматической точки зрения вам гораздо выгоднее напрямую использовать библиотеки Java, такие как Netty, Swing или Joda Time, чем пытаться использовать или изобретать какую-то альтернативу Clojure. Иногда для этих библиотек существуют оболочки Clojure, но в основном они все еще находятся в несколько экспериментальном / незрелом состоянии.
  • Высокопроизводительный код - Я занимаюсь обработкой данных и изображений, где необходима максимальная производительность. Это исключает практически любой подход, который добавляет накладные расходы (такие как ленивые последовательности, создание временных объектов), так что идиоматическое Clojure не будет отвечать всем требованиям. Вы могли бы, вероятно, достичь этого с очень однотипным Clojure (например, с множеством жестких императивных циклов и манипулированием примитивными массивами ...), но если вы собираетесь писать такой код, на Java это часто бывает проще и чище
  • API-интерфейсы с изменяемой семантикой - если API-интерфейсы, на которые вы полагаетесь, зависят от изменяемых объектов, код Clojure для взаимодействия с этими API-интерфейсами может стать немного уродливым и недиоматичным. Иногда написание Java в этих случаях проще.

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

1 голос
/ 30 июня 2011

Одним из возможных ответов может быть библиотека байт-кода, например ASM http://asm.ow2.org/

Но, честно говоря, со временем любая библиотека на Java может быть написана в clojure. Некоторый код Java, скомпилированный в другой байт-код, может быть реплицирован, если в clojure используется ASM.

1 голос
/ 30 июня 2011

Нелегко задать простой ответ на этот ответ, потому что сначала необходимо определить разницу между библиотекой Clojure и библиотекой Java . (Тем более, что Clojure - это библиотека Java:))

Хорошо, давайте начнем с предпосылки, что библиотека Clojure - это любая библиотека, написанная на Clojure, и просто игнорируем код Java в самой реализации Clojure. Но что, если данная библиотека использует некоторую зависимость от Java, как, например, одна из библиотек Apache Commons? Будет ли он по-прежнему считаться Clojure, а не библиотекой Java?

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

Почти тривиально писать оболочки Clojure вокруг таких библиотек Java. По моему опыту, это очень полезно, если вы хотите вписать функциональность библиотеки в общий функциональный дизайн вашего приложения. Простой пример будет, если вы хотите map метод Java против последовательности. Вы можете использовать специальную анонимную функцию для переноса вызова метода или именованную функцию из слоя-оболочки. Если вы делаете такие вещи очень часто, второй подход может быть более подходящим, по крайней мере, для наиболее часто используемых методов.

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

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

0 голосов
/ 30 июня 2011

Я не могу найти цитату в данный момент;но Рич сказал что-то вроде «clojure должен использовать Java везде, где это возможно» и не оборачивать Java без необходимости.Главное заключается в том, чтобы принять платформу Java вместо того, чтобы бороться с ней.поэтому общий совет звучит так:

Если существует хорошая библиотека Java, используйте ее, если не пишите ее в clojure.

0 голосов
/ 30 июня 2011

Много API. Фактически, Clojure сам по себе построен на основе многих надежных API Java, таких как java.util.Collection API. И хорошо известные API Clojure, такие как Incanter, построены на основе библиотек, таких как Parallel Colt и JFreeChart.

0 голосов
/ 30 июня 2011

Библиотеки для создания графических интерфейсов приходят на ум.

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