28 votes

Un flux de travail Clojure efficace ?

Je suis en train de développer un petit projet avec Clojure, mais je me demande si je peux accélérer un peu mon flux de travail.

Mon flux de travail actuel (avec Compojure) est le suivant :

  1. Commencez par Swank avec lein swank .
  2. Allez dans Emacs, connectez-vous avec M-x slime-connect .
  3. Charger tous les fichiers sources existants un par un. Cela permet également de démarrer un serveur Jetty et une application.
  4. Écrire du code dans REPL.
  5. Lorsque je suis satisfait des expériences, j'écris une version complète d'une construction que j'avais en tête. Eval ( C-c C-c ) le.
  6. Passez le REPL dans l'espace de noms où réside cette construction et testez-la.
  7. Passez au navigateur et rechargez l'onglet du navigateur avec la page concernée.
  8. Modifiez le code, évaluez-le, vérifiez-le dans le navigateur.
  9. Répétez l'une des actions ci-dessus.

Il présente un certain nombre d'inconvénients :

  1. Je dois constamment basculer entre Emacs et le navigateur (ou les navigateurs si je teste des choses comme le templating avec plusieurs navigateurs). Existe-t-il un idiome commun pour automatiser cela ? J'avais l'habitude d'avoir un bit JavaScript qui rechargeait la page en permanence, mais son utilité est limitée, évidemment, lorsque je dois interagir avec la page pendant plus de quelques secondes.
  2. Mon instance JVM devient "sale" lorsque j'expérimente et que j'écris des fonctions de test. En fait, les espaces de noms sont pollués, surtout si je remanie et déplace les fonctions entre les espaces de noms. Cela peut entraîner des collisions de symboles et je dois redémarrer Swank. Puis-je annuler la définition d'un symbole ?
  3. Je charge tous les fichiers sources un par un ( C-c C-k ) lors du redémarrage de Swank. Je pense que je m'y prends mal.
  4. Le passage entre le REPL et l'éditeur de fichiers peut être un peu irritant, surtout lorsque j'ai beaucoup d'onglets Emacs ouverts, en plus du ou des navigateurs.

Je cherche des moyens d'améliorer les points ci-dessus et l'ensemble du flux de travail en général, et j'apprécierais donc que vous me fassiez part des vôtres.

P. S.

J'ai également utilisé Vimclojure auparavant, donc les flux de travail basés sur Vimclojure sont également les bienvenus.

19voto

Michał Marczyk Points 54179

Il ne s'agit pas d'une description complète du flux de travail, juste de quelques idées :

  1. Il est possible de supprimer un Var d'un espace de nom à l'aide de la commande ns-unmap fonction. Pour plus de commodité, un undef peut être construite par-dessus, par exemple de la manière suivante :

    (defmacro undef [& syms]
      `(do ~@(map (fn [s] `(ns-unmap *ns* '~s)) syms)))

    ns-unalias peuvent également présenter un intérêt.

  2. Il n'y a aucune raison de parcourir les fichiers contenant les espaces de noms juste pour faire C-c C-k dans chacun d'eux ; vous pouvez juste require les espaces de noms dont vous avez besoin dans le REPL.

    De plus, si vous tapez quelques caractères à la SLIME REPL et que vous utilisez ensuite M-p / M-n pour parcourir l'historique, seules les entrées correspondant à la partie initiale du texte que vous avez saisie à la main seront affichées. Ceci est compatible avec Paredit (les crochets fermants ne posent pas de problème). Donc, si vous accumulez un énorme besoin au début -- (require '[foo :as f] '[bar :as b] '[clojure.contrib.sql :as sql] ...) -- puis après avoir redémarré Swank, tout ce que vous avez à faire est de taper quelque chose comme (require '[f y pulse M-p pour ramener ce formulaire à l'invite du REPL.

    Certes, cela pourrait être automatisé de plusieurs façons (par exemple, en faisant rechercher par le REPL de Swank un fichier de configuration, ou peut-être une simple macro se développant dans un require qui pourrait être utilisé après l'introduction d'un seul espace de noms utilitaire du projet -- en particulier, cette dernière idée serait facile à mettre en oeuvre), mais je trouve que le facteur d'ennui est suffisamment faible pour que je n'aie pas encore pris la peine de l'améliorer.

  3. Vous pouvez utiliser C-c C-z pour faire apparaître une fenêtre avec le SLIME REPL lorsque vous êtes dans un tampon compatible avec SLIME. Vous pouvez également essayer d'utiliser ido si vous ne l'avez pas déjà fait. J'ai tendance à travailler avec un tampon de code ouvert dans une fenêtre sur la gauche de l'écran et un tampon REPL sur la droite. windmove-left y windmove-right lié à quelques touches pratiques, j'ai tendance à être plutôt satisfait. Si j'ai besoin de consulter souvent des tampons supplémentaires, j'utilise des cadres Emacs supplémentaires.

  4. D'ailleurs, je n'utilise pas lein swank Normalement, je préfère mes clojure-project (une version modifiée de l'original de Phil Hagelberg). De temps en temps, je ressens le désir de l'améliorer... peut-être que je m'occuperai de la fonction par-projet import / require l'automatisation la prochaine fois que cela se produit ;-)

5voto

Alex Ott Points 14329

Je ne suis pas sûr pour Lein, mais dans Maven vous pourriez spécifier le nom du repl script (paramètre de configuration replScript), ce qui permet de spécifier quelles commandes seront exécutées au démarrage de REPL & Swank.... Et si vous avez des espaces de noms séparés pour votre projet, vous pourriez utiliser les fonctions de clojure.contrib.find-namespaces pour trouver vos espaces de noms et les charger tous.....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X