2011-11-23 13 views
8

Mi chiedevo se esiste un modo per sviluppare plugin Eclipse in Clojure. Per essere chiari, la domanda non riguarda l'uso di Eclipse per scrivere il codice Clojure.Come sviluppare i plugin Eclipse in clojure?

Sia Eclipse che Clojure funzionano sulla JVM e credo che ci sia il modo di sfruttare la potenza di Clojure (e delle sue librerie) per sviluppare plugin. Stavo specificatamente cercando di usare Korma, ma nel complesso mi piacerebbe spostare i plug-in completi in clojure se esiste un modo naturale per farlo.

+0

Dopo averci pensato un po 'ho avuto un piccolo brainstorm e ho cercato OSGI e Clojure e ho trovato questo post sul blog [esecuzione del clojure in OSGI] (http://www.talios.com/clojure_running_succ essfully_under_osgi.htm) e un [thread di posta elettronica] (http://osdir.com/ml/clojure/2009-10/msg00113.html) che implica che non è una buona idea. Un po 'confuso. – Punit

risposta

10

In senso antiorario, il plugin Eclipse per Clojure, è scritto in Java misto e Clojure. Usa clojure.osgi 1.2.10 ancora.

Quindi è una dimostrazione dal vivo del concetto che è possibile. E AFAIK, in senso antiorario, viene utilizzato con successo da centinaia di persone.

Esistono alcuni vincoli: lo spazio dei nomi di Clojure è "globale" per alcuni "root classloader". PER ESEMPIO. se impacchetti Clojure all'interno di un pacchetto chiamato, ad esempio, myapp.clojure, probabilmente avrai un sacco di altri bundle che richiedono myapp.clojure. Dì ad esempio myapp.bundle1, myapp.bundle2. Quando lo fai, e, da ogni bundle, carica in memoria (richiedono) gli spazi dei nomi dei bundle, ognuno verrà caricato all'interno del ClassLoader giusto (gli spazi dei nomi di myapp.bundle1 verranno caricati nel classloader di contesto di myapp.bundle1, e gli spazi dei nomi di myapp.bundle2 verranno caricati nel classloader di contesto di myapp.bundle2). Questo è grandioso, perché permette all'interoperabilità di java di funzionare correttamente.

Ma ricorda che alla fine, gli spazi dei nomi caricati dal bundle1 & bundle2 saranno gestiti dal "mondo del namespace globale" in bundle myapp.clojure.

Per essere onesti, questo non ha ancora dimostrato un problema in senso antiorario. Perché all'interno della stessa caratteristica, avere i bundle condividere una singola istanza di Clojure è quasi ok.

I potenziali svantaggi sono:

  • se si utilizzano le librerie di terze parti, ad esempio tools.logging, non sarà possibile avere spazi dei nomi in myapp.bundle1 a seconda della versione X di tools.logging e allo stesso tempo myapp.bundle2 dipenderà dalla versione Y di tools.logging. Cioè, all'interno della tua funzione in cui hai un clojure condiviso tramite bundle myapp.clojure, lavori come se le regole OSGi non si applicassero, ad esempio, come funzionano le webapp.
  • non viene scalato correttamente se applicato in modo massivo: se ogni funzione Eclipse dovesse riconfezionare la propria versione di Clojure, ci sarebbe uno spreco di memoria. Ma questo inconveniente è più teorico che pratico, ancora. E questo è un problema che può essere affrontato in seguito, quando ne emergerà la necessità.

Si noti che per un prodotto Eclipse RCP, al contrario di un plug-in Eclipse, questi svaniscono.

Se volete vedere come antiorario abbia riconfezionato clojure, e utilizza clojure.osgi, si può guardare al suo codice sorgente:

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

HTH,

- Laurent

3

È perfettamente possibile scrivere i plug-in Eclipse in Groovy o Scala. Poiché Clojure produce file .class, non dovrebbe essere diverso. Tuttavia, i plug-in vengono normalmente esportati utilizzando PDE Build, che gestisce solo Java per impostazione predefinita, quindi sarà necessario scrivere un file customCallback.xml che può compilare Clojure (vedere per la versione di Scala).