Domanda

Uso Clojure da un po 'di tempo e voglio creare alcuni progetti più grandi e complicati dei giocattoli. Ho usato Java negli ultimi anni e mi sono abituato a ciò che fanno gli IDE per me: compilare molte classi, impacchettarli in vasetti, creare file batch per gli utenti con cui avviarli.

Quando guardo esempi di sviluppo in Clojure sembrano essere sulla falsariga di caricare i file nel REPL, vedere come funzionano, modificare il file, ricaricare, ripetere. Nary una classe o un barattolo viene generato ovunque. Nel fantastico "Clojure di programmazione" di Stuart Halloway " Non sono riuscito a trovare un singolo esempio di ": gen-class " ;, ad esempio. Gli IDE Clojure che ho usato (ClojureBox e il plug-in NetBeans enclojure) sembrano promuovere lo stesso flusso di lavoro.

È intenzionale? Gli strumenti sono troppo immaturi o non riesco a "capirlo"?

Mi piacerebbe ascoltare alcuni esempi di flussi di lavoro di persone che hanno creato alcuni programmi non banali per essere utilizzati da utenti regolari (non altri sviluppatori), se possibile.

Grazie per aver condiviso le tue opinioni.

È stato utile?

Soluzione

Penso che ci siano davvero 2 domande qui:

A) come distribuire (e costruire e gestire le dipendenze). Tutto quello che posso dire è guardare altri progetti con obiettivi / domini simili e copiarli.

B) Flusso di lavoro:

Il mio flusso di lavoro è così:

  1. apri un file e scrivi alcune dichiarazioni di buon auspicio di alto livello

  2. inizia a scrivere alcune funzioni per supportarlo

2.5 copia le definizioni delle funzioni in REPL mentre le creo

  1. apri un altro file e scrivi alcuni test di base per verificare che la funzione funzioni

3.5 copiarli nella REPL

  1. scorre tra i due buffer costruendo i test fino a un esempio e il programma verso un obiettivo finale. Alla fine queste diventano attività simili e so di aver finito.

  2. esegue il wrapping del file secondario in deftest

Ora, quando torno tra un mese, posso semplicemente eseguire i miei test ed essere felice! Salvare i buffer REPL può fornire un valore con un piccolo sforzo. Questo è ciò che funziona per me al momento, e sono felice di essere istruito su approcci migliori.

Per quanto riguarda la selezione di IDE vs REPL - la maggior parte degli IDE ha plug-in che hanno REPLs quindi non sono sicuro che sia una o l'altra scelta - in realtà è proprio su quale editor di testo sei produttivo e su come vuoi gestire la struttura del tuo progetto. Non ci sono strutture "fai così" prefabbricate AFAIK, quindi a questo punto è più facile guardare progetti specifici (come Clojure stesso, penombra o compojure o una qualsiasi delle librerie elencate nel sito principale.

Altri suggerimenti

L'approccio allo sviluppo di REPL è stato incoraggiato dalla maggior parte degli IDE della famiglia LISP (e di altri linguaggi funzionali) per molto tempo. Alcuni di questi REPL presentano anche le funzionalità di completamento automatico che potresti associare a un IDE Java.

REPL offre alcuni importanti vantaggi rispetto all'approccio standard. Il primo è che ti permette di eseguire codice arbitrario durante il runtime del tuo programma, il che può rendere molto più semplice il debug di sistemi multi-thread. In secondo luogo, e ancora più importante, semplifica il test delle funzioni durante la codifica. Non è necessario creare un framework attorno a una nuova funzione o classe, puoi giocarci direttamente nel REPL e vedere come risponde a una varietà di casi d'uso.

Bene, per cominciare, praticamente qualsiasi plug-in di sviluppo decente per qualsiasi editor o IDE ti darà un modo per usare Clojure REPL dall'interno dell'IDE. Probabilmente ti permettono anche di caricare i file nel REPL per i test e così via. Non è necessario scegliere l'uno o l'altro.

Enclojure sta facendo molta strada, questo è certo. Tuttavia, molte persone sono perfettamente soddisfatte dell'utilizzo di Emacs, incluso me stesso. Emacs usa un Lisp come linguaggio di configurazione, quindi di solito è la scelta più naturale per un Lisper.

Per le lingue che hanno REPL, l'uso della REPL come parte principale del processo di sviluppo è la norma. Modifica dei file, caricandoli nel REPL, giocando con loro per vedere se un'opera, risciacqua, ripeti. Questo è uno dei maggiori vantaggi delle lingue con REPL come Clojure e Haskell e CL e simili.

Per quanto riguarda la costruzione di vasetti e la compilazione di codice Clojure e cose del genere, è semplice. Se non vuoi, non devi nemmeno davvero / avere / compilare il codice Clojure per la maggior parte del tempo. Quando lo fai, AOT lo compili con gen-class, che lo compila in file di classe che puoi quindi mettere in un barattolo. Ci sono tonnellate di esempi e persino tutorial sparsi tra le interwebs. Il modo più semplice ed efficiente è usare qualcosa come Ant e scrivere uno script di compilazione che compili il codice Clojure e generi il file .jar per te. La prima volta che l'ho fatto, ho pensato che sarebbe stato difficile da fare, ma in realtà è stato davvero semplice. Ho appena guardato i file di build di Clojure e Clojure-Contrib Ant e ho fatto riferimento alle pagine della guida di Ant per tutto il necessario.

Una cosa che dovrei menzionare è il fatto che Enclojure / effettivamente / costruisce file .jar eseguibili per te, se lo richiedi. Sono sicuro che in futuro verranno aggiunte cose più avanzate a cui sei abituato. Sono, in effetti, ancora abbastanza nuovi.

Uso entrambi - Eclipse IDE e plug-in antiorario che fornisce un REPL. Questa è una combinazione particolarmente piacevole se sviluppi il codice Java insieme a Clojure (come faccio io).

Il mio approccio generale è:

  • Scrivi il codice Clojure nell'editor
  • Tieni aperto un REPL per testare le cose (Ctrl + Invio è un collegamento utile qui: esegue qualsiasi codice selezionato nel tuo editor nel REPL)
  • Utilizza gli strumenti IDE generici per la gestione dei progetti, costruzione, test, SCM ecc.

A volte, lavoro anche esclusivamente in REPL. Questo di solito è meglio per testare le cose rapidamente. Se mi piace particolarmente un pezzo di codice di prova, lo copierò / incollerò semplicemente dal REPL nella mia suite di test.

Quello che faccio è creare un progetto con Leiningen. Se vuoi solo spazzare via per un po ', puoi semplicemente digitare rimpiazzare lein e il tuo percorso di classe del progetto sarà impostato per quel rimpiazzo.

In realtà, però, utilizzo Emacs, melma e clojure swank. Dopo essere passato al progetto, digita semplicemente M-x clojure-jack-in . Questo avvia il server swank e lo slime si connette ad esso e hai un sostituto in un buffer. Ovviamente solo questo non vale di più che eseguire un sostituto in una shell. Quello che ottieni è la possibilità di scrivere codice in un altro buffer, e con un keybinding seleziona sexps o unità più grandi ed eseguili nel sostitu per vedere se funziona. Anche la melma ti offre utili combinazioni di tasti per attività comuni. Vedi swank-clojure su github per maggiori informazioni.

JohnJ, puoi fare la stessa cosa in Emacs. In realtà quella frase è probabilmente una tautologia.

(add-hook 'after-save-hook etc.

Ecco l'esempio after-save-hook di qualcuno per git: https://gist.github.com/449668

Con Eclipse, è possibile eseguire unit test (o qualsiasi programma) ogni volta che si salva un file nel progetto. L'intero processo richiede meno di un secondo: è ottimo per lo sviluppo guidato dai test e rimuove la necessità di tagliare e incollare nel REPL per la maggior parte delle situazioni. Inoltre puoi continuare i test! : -)

Ti consigliamo di utilizzare cake per evitare il tempo di avvio di JVM ogni volta che avvii i test. Puoi eseguire cake test dalla riga di comando o fare semplicemente eseguire Eclipse per te quando salvi un file nel tuo progetto.

Ho ottenuto che funzioni impostando un progetto con Leiningen , installando cake e installazione del antiorario plugin Eclipse. Per impostare Eclipse per eseguire i test ogni volta che salvi, seleziona Project- > Properties- > Builders, fai clic su Nuovo, seleziona Programma, chiamalo come "esegui test", aggiungi il percorso a cake in Posizione, seleziona la Directory di lavoro per il tuo progetto e aggiungi test agli argomenti opzionali. Nella scheda "Opzioni di costruzione", seleziona "Durante le build automatiche".

Ho avuto l'idea generale per questo dal libro di Jeff Younker, "Foundations of Agile Python Development." Sono stato un uomo Emacs per 20 anni, ma questo trucco ha recentemente messo Eclipse al primo posto nel mio flusso di lavoro.


Aggiornamento: circa un anno dopo, ora uso Midje con l'opzione più pigra per fare la stessa cosa durante lo sviluppo con Emacs ed Eclipse.

  

" Quando guardo esempi di sviluppo in Clojure sembrano essere sulla falsariga di caricare i file nel REPL, vedere come funzionano, modificare il file, ricaricare, ripetere. Nary una classe o un barattolo viene generato ovunque ... Mi piacerebbe ascoltare alcuni esempi di flusso di lavoro da parte di persone che hanno creato alcuni programmi non banali per essere utilizzati dagli utenti regolari (non da altri sviluppatori), se possibile. & Quot;

Gli esempi in Debug delle funzioni clojure che vengono invocate nel codice java (eclipse) sono banali, ma illustrano come in eclipse si possano collegare progetti in modo tale da poter richiamare la funzionalità clojure / scala dall'interno di java.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top