Как разработать плагины Eclipse в Clojure?

Мне было интересно, есть ли способ разработки плагинов Eclipse в Clojure. Чтобы было ясно, вопрос не в том, чтобы использовать Eclipse для написания кода Clojure.

И Eclipse, и Clojure работают на JVM, и я считаю, что должен быть способ использовать возможности Clojure (и его библиотек) для разработки плагинов. Я специально рассматривал использование Korma, но в целом я хотел бы переместить полные плагины для закрытия, если есть естественный способ сделать это.

3 ответа

Решение

Плагин Eclipse для Clojure против часовой стрелки написан на смешанных Java и Clojure. Он пока использует clojure.osgi 1.2.10.

Так что это живое подтверждение концепции, что это возможно. А AFAIK против часовой стрелки успешно используется сотнями людей.

Есть некоторые ограничения, хотя: пространство имен Clojure является "глобальным" для некоторого "корневого загрузчика классов". Например, если вы упаковываете Clojure в пакет с именем, скажем, myapp.clojure, то у вас, вероятно, будет куча других пакетов, для которых потребуется myapp.clojure. Скажем, например, myapp.bundle1, myapp.bundle2. Когда вы это сделаете и из каждого пакета загрузите в память (потребуете) пространства имен пакетов, каждое из них будет загружено из правого ClassLoader (пространства имен myapp.bundle1 будут загружены в контекстный загрузчик классов myapp.bundle1, и Пространства имен myapp.bundle2 будут загружены в контекстный загрузчик классов myapp.bundle2). Это здорово, потому что это позволяет Java-взаимодействию нормально работать.

Но просто помните, что в конце концов пространства имен, загруженные из bundle1 & bundle2, будут удерживаться "глобальным миром пространства имен" в bundle myapp.clojure.

Честно говоря, это еще не оказалось проблемой для против часовой стрелки. Потому что внутри одной и той же функции наличие пакетов в одном экземпляре Clojure почти нормально.

Потенциальные недостатки:

  • если вы используете сторонние библиотеки, например tools.logging, вы не сможете иметь пространства имен в myapp.bundle1, зависящие от версии X tools.logging, и в то же время myapp.bundle2 зависят от версии Y tools.logging., То есть, внутри вашей функции, где у вас есть совместное закрытие через пакет myapp.clojure, вы работаете так, как если бы правила OSGi не применялись, как, например, веб-приложения.
  • плохо масштабируется при массовом применении: если бы каждая функция Eclipse должна была упаковать свою собственную версию Clojure, это привело бы к некоторой трате памяти. Но этот недостаток скорее теоретический, чем практический. И это проблема, которую можно решить позже, когда возникнет необходимость в этом.

Обратите внимание, что для продукта Eclipse RCP, в отличие от плагина Eclipse, эти недостатки исчезают.

Если вы хотите увидеть, как Counterclockwise перепаковал clojure и использует clojure.osgi, вы можете посмотреть его исходный код:

http://github.com/laurentpetit/ccw.clojure.git http://github.com/laurentpetit/ccw.git

НТН,

- Лоран

Кажется, он не доступен в Eclipse 3.x, но планируется для Eclipse 4, как упоминалось в http://wiki.eclipse.org/E4/Languages.

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

Вполне возможно написать плагины Eclipse в Groovy или Scala. Поскольку Clojure создает файлы.class, он не должен отличаться. Однако плагины обычно экспортируются с помощью PDE Build, которая по умолчанию обрабатывает только Java, поэтому вам придется написать customCallback.xml файл, который может компилировать Clojure (см. http://www.michel-kraemer.com/scala-projects-with-eclipse-pde-build-2 для сборки Scala).

Другие вопросы по тегам