Question

J'utilise Clojure depuis un petit moment et je veux créer des projets plus grands et plus compliqués que des jouets. J'utilise Java depuis quelques années et je me suis habitué à ce que les IDE font pour moi: compiler de nombreuses classes, les empaqueter dans des fichiers JAR, créer des fichiers de commandes que les utilisateurs pourront utiliser pour les démarrer.

Quand je regarde des exemples de développement dans Clojure, ils semblent être comme des fichiers de chargement dans le REPL, voyez comment ils fonctionnent, éditez le fichier, rechargez, répétez. Nary une classe ou un pot étant généré n'importe où. Dans la formidable "Programmation Clojure" de Stuart Halloway Je ne pouvais pas trouver un seul exemple de ": gen-class", par exemple. Les IDE Clojure que j'ai utilisés (ClojureBox et le plugin NetBeans inclus) semblent favoriser ce même flux de travail.

Est-ce intentionnel? Les outils sont-ils trop immatures ou est-ce que je ne "l'obtiens pas"?

J'aimerais entendre des exemples de flux de travail de personnes qui ont créé des programmes non triviaux à utiliser par les utilisateurs réguliers (et non par d'autres développeurs) si possible.

Merci d'avoir partagé vos opinions.

Était-ce utile?

La solution

Je pense qu'il y a vraiment 2 questions ici:

A) comment déployer (et créer et gérer des dépendances). Tout ce que je peux dire, c'est regarder d'autres projets avec des objectifs / domaines similaires et les copier.

B) Flux de travail:

Mon flux de travail est le suivant:

  1. ouvrez un fichier et écrivez des déclarations de haut niveau sur un voeu pieux

  2. commencez à écrire des fonctions pour le supporter

2.5 copier les définitions de fonction dans REPL au fur et à mesure que je les crée

  1. ouvrez un autre fichier et écrivez quelques tests de base pour vérifier que la fonction fonctionne

3.5 copiez-les dans le REPL

  1. itère entre les deux tampons construisant les tests jusqu'à un exemple et le programme vers un objectif final. Celles-ci finissent par devenir des activités similaires et je sais que j’ai terminé.

  2. encapsulez le fichier secondaire dans l'analyse détaillée

Maintenant, quand je reviens dans un mois, je peux simplement faire mes tests et être heureux! L'enregistrement de vos tampons REPL peut apporter une valeur ajoutée avec peu d'effort. C’est ce qui me convient actuellement et je suis heureux d’être éduqué à de meilleures approches.

En ce qui concerne la sélection IDE ou REPL - la plupart des IDE ont des plugins qui ont des REPL, je ne suis donc pas sûr que ce soit l'un ou l'autre choix - c'est vraiment l'éditeur de texte dans lequel vous êtes productif et comment vous souhaitez le gérer. votre structure de projet. Il n’existe pas de structures prédéfinies AFAIK prédéfinies, il est donc plus facile d’examiner des projets spécifiques (comme Clojure, Penumbra, Compojure ou l’une des bibliothèques répertoriées sur le site principal.

Autres conseils

L’approche de développement REPL a été encouragée par la plupart des IDE de la famille LISP (et d’autres langages fonctionnels) pendant une longue période. Certains de ces REPL comportent également les fonctionnalités de saisie semi-automatique que vous pouvez associer à un IDE Java.

REPL vous offre quelques avantages majeurs par rapport à l’approche standard. La première est que cela vous permet d'exécuter du code arbitraire pendant l'exécution de votre programme, ce qui peut simplifier le débogage de systèmes multithreads. Deuxièmement, et plus important encore, il est facile de tester vos fonctions pendant que vous codez. Vous n'avez pas besoin de construire un cadre autour d'une nouvelle fonction ou classe, vous pouvez l'utiliser directement dans la réplique et voir comment il répond à une variété de cas d'utilisation.

Eh bien, pour commencer, pratiquement tout plug-in de développement décent pour un éditeur ou un IDE vous donnera le moyen d'utiliser le REPL de Clojure à partir de l'EDI. Probablement même vous permettre de charger des fichiers dans le REPL pour des tests et autres. Vous n'avez pas besoin de choisir l'un ou l'autre.

La clôture va très loin, c’est certain. Cependant, la plupart des gens sont parfaitement satisfaits d'utiliser Emacs, y compris moi-même. Emacs utilise un langage Lisp comme langage de configuration, ce qui en fait le choix le plus naturel pour un lecteur Lisper.

Pour les langues dotées de REPL, l’utilisation de cette dernière en tant que partie importante du processus de développement est la norme. Editer des fichiers, les charger dans le REPL, jouer avec eux pour voir si un travail, un rinçage, une répétition. C’est l’un des principaux avantages des langages utilisant des REPL comme Clojure, Haskell, CL, etc.

.

Pour ce qui est de la construction de bocaux et de la compilation de code Clojure, c'est simple. Vous n'avez même pas vraiment / devez / Compiler du code Clojure la plupart du temps si vous ne le souhaitez pas. Lorsque vous le faites, vous le compilez AOT avec gen-class, qui le compile dans des fichiers de classe que vous pouvez ensuite mettre dans un fichier jar. Il y a des tonnes d'exemples et même de tutoriels répartis entre les sites Web. Le moyen le plus simple et le plus efficace consiste à utiliser quelque chose comme Ant et à écrire un script de construction qui compile le code Clojure et génère le .jar pour vous. La première fois que je l'ai fait, je pensais que ce serait difficile à faire, mais c'était en réalité très simple. Je viens de regarder les fichiers de construction Ant pour Clojure et Clojure-Contrib, et j'ai référencé les pages d'aide de Ant pour tout ce dont j'avais besoin.

Une chose que je devrais mentionner est le fait qu'Enclojure crée / construit réellement des fichiers .jar exécutables pour vous, si vous le lui demandez. Je suis sûr que les choses plus avancées que vous avez l'habitude de faire seront ajoutées à l'avenir. Ils sont, en effet, encore assez nouveaux.

J'utilise à la fois - Eclipse IDE et le plug-in Counterclockwise qui fournit un REPL. C’est une combinaison particulièrement intéressante si vous développez du code Java aux côtés de Clojure (comme je le fais).

Mon approche générale est la suivante:

  • Écrire du code Clojure dans l'éditeur
  • Maintenez une REPL ouverte pour tester des choses (Ctrl + Entrée est un raccourci utile ici: il exécute le code sélectionné dans votre éditeur dans la REPL)
  • Utilisez les outils génériques de l'EDI pour la gestion de projet, la construction, les tests, la gestion de la chaîne logistique, etc.

Parfois, je travaille également uniquement dans le REPL. C'est généralement mieux pour tester les choses rapidement. Si j'aime particulièrement un morceau de code de test, je vais simplement le copier / coller du REPL dans ma suite de tests.

Ce que je fais est de créer un projet avec Leiningen. Si vous souhaitez simplement vous éloigner un moment, vous pouvez simplement taper lein repl et le chemin d'accès aux classes de votre projet sera configuré pour cette réplique.

En fait, j’utilise Emacs, slime et swank clojure. Après avoir accédé au projet, il vous suffit de saisir M-x clojure-jack-in . Cela démarre le serveur swank et slime se connecte à lui et vous avez un repl dans un tampon. Bien sûr, cela ne vaut pas plus que d’exécuter un repl dans un shell. Ce que vous obtenez est la possibilité d'écrire du code dans un autre tampon, et avec un raccourci clavier, sélectionnez sexps ou des unités plus grandes et exécutez-les dans la réplique pour voir si cela fonctionne. Slime vous donne également des raccourcis clavier utiles pour les tâches courantes. Voir swank-clojure sur github pour plus d’informations.

JohnJ, vous pouvez faire la même chose dans Emacs. En fait, cette phrase est probablement une tautologie.

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

Voici l'exemple de quelqu'un après-save-hook pour git: https://gist.github.com/449668

Avec Eclipse, vous pouvez exécuter des tests unitaires (ou n’importe quel programme) chaque fois que vous enregistrez un fichier dans le projet. L'ensemble du processus prend moins d'une seconde - il est idéal pour le développement piloté par les tests et élimine le besoin de couper-coller dans le REPL dans la plupart des situations. De plus, vous gardez les tests! : -)

Vous voudrez utiliser le gâteau pour éviter le temps de démarrage de la machine virtuelle Java chaque fois que vous lancez vos tests. Vous pouvez exécuter test de gâteau sur la ligne de commande ou simplement le faire exécuter par Eclipse lorsque vous enregistrez un fichier dans votre projet.

Cela a fonctionné en mettant en place un projet avec Leiningen , en installant cake et installation du sens antihoraire plug-in Eclipse. Pour configurer Eclipse afin qu'il exécute des tests chaque fois que vous enregistrez, sélectionnez Projet -> Propriétés -> Constructeurs, cliquez sur Nouveau, sélectionnez Programme, appelez-le comme "exécuter des tests", ajoutez le chemin d'accès à gâteau . sous Emplacement, sélectionnez le répertoire de travail de votre projet et ajoutez test aux arguments facultatifs. Sous l'onglet "Options de construction", sélectionnez "Au cours de la génération automatique".

L’idée générale en est tirée du livre de Jeff Younker, intitulé "Foundations of Agile Python Development". Je suis un homme Emacs depuis 20 ans, mais cette astuce a récemment mis Eclipse au premier plan de mon flux de travail.

Mise à jour: environ un an plus tard, j'utilise maintenant Midje avec l'option lazytest pour faire la même chose lors du développement avec Emacs et Eclipse.

  

"Lorsque j'examine les exemples de développement dans Clojure, ils semblent se situer le long des lignes de chargement des fichiers dans le REPL, voyez comment ils fonctionnent, modifiez le fichier, rechargez, répétez. Nary une classe ou un pot étant généré n'importe où ...... J'aimerais entendre quelques exemples de flux de travail de personnes qui ont créé des programmes non triviaux que les utilisateurs réguliers (et non d'autres développeurs) pourraient utiliser, si possible.

Les exemples sur Débogage des fonctions de clojure invoquées dans le code java (eclipse) sont triviales, mais illustrent comment, dans eclipse, on peut lier des projets de manière à pouvoir appeler la fonctionnalité clojure / scala à partir de java.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top