2010-06-06 16 views
28

Pracuję nad projektem dla zwierząt domowych z Clojure, ale zastanawiam się, czy mogę przyspieszyć mój przepływ pracy.Efficient Clojure workflow?

Mój obecny workflow (z Compojure) wynosi:

  1. start Swank z lein swank.
  2. Przejdź do Emacs, połącz się z M-x slime-connect.
  3. Załaduj wszystkie istniejące pliki źródłowe, jeden po drugim. To również uruchamia serwer Jetty i aplikację.
  4. Napisz kod w REPL.
  5. Po wykonaniu eksperymentów napisz pełną wersję konstruktu, który miałem na myśli. Eval (C-c C-c) to.
  6. Przełącz REPL na obszar nazw, w którym znajduje się ten konstrukt i przetestuj go.
  7. Przełącz na przeglądarkę i ponownie załaduj kartę przeglądarki ze stroną, której dotyczy problem.
  8. Popraw kod, sprawdź go, sprawdź w przeglądarce.
  9. Powtórz dowolne z powyższych.

Istnieje szereg niedogodności z nim:

  1. muszę przełączać pomiędzy Emacs i przeglądarkę (lub przeglądarek czy jestem testowania rzeczy jak szablonów z wieloma przeglądarkami) cały czas. Czy istnieje wspólny idiom do automatyzacji tego? Miałem kiedyś bit JavaScript, który przeładowuje stronę w sposób ciągły, ale ma ograniczone zastosowanie, oczywiście, gdy muszę wchodzić w interakcję ze stroną przez więcej niż kilka sekund.
  2. Moja instancja JVM staje się "brudna", kiedy eksperymentuję i piszę funkcje testowe. Zasadniczo przestrzenie nazw stają się zanieczyszczone, szczególnie gdy przeprowadzam refaktoryzację i przenoszę funkcje między przestrzeniami nazw. Może to doprowadzić do kolizji symboli i muszę ponownie uruchomić Swank. Czy mogę usunąć symbol?
  3. Po ponownym uruchomieniu Swank ładuję wszystkie pliki źródłowe jeden po drugim (C-c C-k). Podejrzewam, że robię to wszystko źle.
  4. Przełączanie między REPL a edytorem plików może być trochę irytujące, szczególnie gdy mam otwartych wiele kart Emacsa, razem z przeglądarką (przeglądarkami).

Szukam sposobów poprawy powyższych punktów i całego przepływu pracy w ogólności, więc byłbym wdzięczny, gdybyś podzielił się swoją.

P. S.

Mam również wykorzystywane Vimclojure wcześniej, więc przepływy Vimclojure oparte są zbyt mile widziane.

Odpowiedz

19

Nie kompletny opis workflow, kilka pomysłów:

  1. Jest możliwe, aby usunąć Var z nazw z funkcją ns-unmap. Dla większej wygody można na nim zbudować makro undef, np. tak jak:

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

    ns-unalias może również zainteresować.

  2. Nie ma powodu, aby przeglądać pliki przechowujące przestrzenie nazw po to, aby w każdym z nich wykonać tylko jedną czynność: C-c C-k; możesz po prostu require przestrzeni nazw, które potrzebujesz w REPL.

    Ponadto, jeśli wpiszesz kilka znaków w szlamie REPL a następnie użyć M-p/M-n przeglądać historię, zostanie wyświetlona tylko wpisy dopasowania początkowy fragment tekstu wprowadzonego ręcznie. Jest to zgodne z Paredit (tylny nawias zamykający nie będzie problemem). Jeśli więc na początku budujesz ogromne zapotrzebowanie - (require '[foo :as f] '[bar :as b] '[clojure.contrib.sql :as sql] ...) - wtedy po ponownym uruchomieniu Swanka wystarczy wpisać coś takiego, jak (require '[f i nacisnąć M-p, aby ponownie przywieść ten formularz do monitu REPL.

    Oczywiście może to być zautomatyzowane na wiele sposobów (np. Po znalezieniu pliku konfiguracyjnego przy pomocy polecenia Swank REPL lub prostego makra rozwijającego się w odpowiedni formularz require, który może zostać użyty po wprowadzeniu tylko jednego obszaru nazw użytkowych z projekt - zwłaszcza ten drugi pomysł byłby łatwy do wdrożenia), ale uważam, że jest on wystarczająco niski w kwestii irytacji, której do tej pory nie zawracałem sobie głowy żadnymi ulepszeniami.

  3. Możesz użyć C-c C-z, aby utworzyć okienko z wyskakującym okienkiem SLIME REPL, gdy jesteś w buforze z włączonym SLIME. Powinieneś także spróbować użyć ido, jeśli jeszcze tego nie zrobiłeś. Mam tendencję do pracy z buforem kodu otwartym w oknie po lewej stronie ekranu i buforem REPL po prawej stronie; z windmove-left i windmove-right związanymi z wygodnymi klawiszami, jestem całkiem szczęśliwy. Jeśli muszę często przeglądać dodatkowe bufory, używam dodatkowych ramek Emacsa.

  4. Normalnie wolę niestandardową funkcję clojure-project (ulepszoną wersję oryginału Phila Hagelberga). Czasem mam ochotę ją ulepszyć ... być może poradzę sobie z automatyzacją jednego projektu za każdym razem, kiedy to się stanie. ;-)

5

nie jestem pewien o Lein, ale w Maven można podać nazwę skryptu repl (replScript config param), który pozwala określić, które polecenia będą wykonywane na początku REPL & Swank ... A jeśli masz osobny obszar nazw dla swojego projektu, możesz użyć funkcji z clojure.contrib.find-namespaces, aby znaleźć swoje przestrzenie nazw i załadować je wszystkie ....