Frage

Ich bin neu in Clojure und fange an, Experimentieren Sie mit dem erstellen einer Anwendung.

So weit, ich habe alles gesehen, über tutorials auf die Erstellung Clojure-Programme beinhaltet Interaktivität.Zum Beispiel "das laden der REPL und Typ (load-file "dies-oder-das") zu laufen.Das ist gut, aber es ist nicht genug.

Ich bin also verwendet, um den edit-compile-run-Idiome, die von Sprachen wie C oder Delphi, dass ich instinktiv getrieben, um Sie zu Bearbeiten, dann drücken Sie "M-x compile".

Das problem ist, dass "lein uberjar", die ich verstehe, ist das äquivalent zu "machen", ist schmerzhaft langsam ausgeführt, auch für eine hello-Welt.Also ich bin zu haben, um herauszufinden, wie dieses "interaktive Entwicklung" funktioniert, stoppen Sie die Verwendung des uberjar wie es ist schnell zu machen, und speichern Sie es nur für das Ende des Tages.

Eine andere Sache, die ich bemerkte, beim bauen (mit lein uberjar) ist, dass der kleine GUI-app, die ich arbeite pops up Rahmen der Kompilierung, als wenn Sie Ausführung beim kompilieren.Es scheint nur ein bisschen, im Gegensatz zu mir;es ist nicht ganz Analog zu "machen", wie ich gedacht hatte.

Ich weiß, die Lisp Weg der Entwicklung die Dinge interaktiv arbeiten in der REPL, und ich bin nicht versuchen, das zu ändern:Ich möchte Anpassung an diese Lebensweise.Leider habe ich gesehen, wie wenig in der form der Dokumentation, wie dies zu tun.Für Beispiel, wie zu setzen Sie den aktuellen Zustand der Maschine.Es scheint nur eine Art von chaotisch zu halten gerade Erstellung von individuellen snippets on the fly, ohne in der Lage zu tun einige Art von reset.

Die meisten tutorials, die ich gesehen habe auf Clojure (und Lisp) und scheinen im Allgemeinen Fokus auf hacking in der REPL.Best practices für die Bereitstellung von Anwendungen, bleibt mir ein Rätsel.Meine Benutzer nur Benutzer;Sie sind nicht die Entwickler, die gehen, um Dateien zu laden in einer REPL.

Also hier ist meine Frage:alle Ressourcen, die für gute Informationen oder Anleitungen, die den gesamten Prozess des Aufbaus einer Clojure-Anwendung, einschließlich der Bereitstellung?

(Hinweis:Ich habe alle Komponenten installiert sind und arbeiten (z.B.Emacs, Slime, Leiningen, etc.), das ist also nicht eine Frage).

War es hilfreich?

Lösung

Ein paar kurze Hinweise, dann ein paar links:

Nicht verwenden lein uberjar während der Entwicklung;lieber lein jar.Der Unterschied ist, dass lein uberjar setzt alle Ihre Abhängigkeiten in der generierten jar (einschließlich Clojure selbst), so dass Sie Ihre single jar ist eine vollständig selbst-enthalten Paket mit Ihrer app im inneren; lein jar nur Gläser Ihren eigenen code.Die uberjar Ansatz hat offensichtliche Vorteile für die Bereitstellung, aber für die Entwicklung, Sie sollten in der Lage sein, benutzen Sie einfach das entsprechende Klassenpfad beim ausführen Ihrer app, sparen Sie sich die notwendige Zeit für die Erstellung eines uberjar.Wenn Sie nicht wollen, um hand-verwalten Sie den Klassenpfad für den test ausgeführt wird, überprüfen Sie heraus die lein run plugin.

Auch die meisten wahrscheinlich die Mehrheit der Ihr code sollte eigentlich nicht sein AOT-kompiliert.AOT ist notwendig, einige Java-interop-Szenarien, aber die meisten der Zeit es bringt eine leichte Anhebung in startup-Geschwindigkeit und die lästigen Probleme mit der binären Kompatibilität mit verschiedenen Versionen von Clojure.Ich nehme an, das letztere Problem ist nicht relevant für eine uberjar-ed standalone-app Art-Projekt, aber jeder code für die Bibliothek zumindest sein sollten Links zu JIT-ed, wenn überhaupt möglich.Mit Leiningen, kannst du eine :namespaces Klausel in der defproject form in project.clj um zu bestimmen, welche namespaces erarbeitet werden;was auch immer man gerade JIT-ed by default.Ältere Versionen von Leiningen verwendet, um zu kompilieren, alles standardmäßig, das ist eigentlich ein guter Grund für ein upgrade!

Wie bei der windows herausspringen während der Kompilierung, würde ich vermuten, dass Sie entweder mit Windows-sich-knallen-code bei der makro-expansion der Zeit oder außerhalb einer Funktion definition oder ähnliches zu konstruieren.(So etwas wie ein (println "Foo!") auf der obersten Ebene.) Das ist nur etwas, was Sie nicht tun sollten, nehme ich an-es sei denn, Sie planen, führen Sie Ihren code als Skript, sowieso.Um das problem zu vermeiden, wickeln side-effecting code oben in Funktionsdefinitionen und bieten einen Einstiegspunkt für Ihre Anwendung mit dem :main Klausel in project.clj.(Wenn Sie sagen :main foo, dann die -main Funktion aus der foo namespace verwendet, die als Einstiegspunkt in die app.Das ist der Standard, sowieso, und zumindest die oben genannten lein run scheint der name hardcoded-nicht sicher über die lein selbst.)

Wie zum zurücksetzen des Staates des REPL-Sie können einfach starten Sie es neu.Mit SLIME, M-x slime-restart-inferior-lisp wird, dass dies nur unter Beibehaltung aller anderen Zustand Ihrer Emacs-Sitzung.

Siehe auch diese Diskussion auf der Clojure Google-Gruppe:

  1. Clojure für die system-administration
  2. Prepping clojure für die Verpackung (war:Re:Clojure für die system-administration)
  3. Leiningen, Clojure und Bibliotheken:was vermisse ich?

Andere Tipps

Nein, Sie geben keine Funktionen auf dem REPL.

Sie Ihre Quelldateien bearbeiten, wie üblich. Der Lisp Vorteil ist, dass Sie das System zur gleichen Zeit im Hintergrund laufen, so dass Sie einzelne Funktionen aus Ihrer Quelldatei kompilieren und sie in das laufenden System setzen, oder sogar dort ersetzen.

Wenn Sie Slime verwenden möchten, drücken Sie C-c C-c in der Quelldatei die Funktion an der Stelle zu kompilieren und zu laden. Sie können wechseln Sie dann auf die REPL zu testen und erkunden, aber alles, was Sie als Quelle beharren wollen, setzen Sie in Ihre Quelldateien.

Tutorials in der Regel durch Eingabe Dinge auf dem REPL beginnen, denn es gibt nicht viel Sie dafür einrichten müssen, aber ernsthafte Entwicklung integriert die laufende System und Quelldateiverwaltung.


Nur um zu veranschaulichen, meine übliche Workflow (Ich bin mit Common Lisp, aber Clojure sind ähnlich) ist wie folgt:

  • Start Emacs
  • M-x slime starten Slime, das Lisp-System, und schließen Sie die zwei über Swank
  • , (Befehl) load-system foo das aktuelle Projekt zu laden, in das Bild (nur bei Bedarf kompilieren)
  • C-x b Wechsel zu einem Quellenpuffer
  • C-c ~ machen das Quellverzeichnis das aktuelle Verzeichnis und das Quellpaket das aktuelle Paket der REPL

Nun, ich eingerichtet mit meinem System im Hintergrund ausgeführt wird. Arbeiten ist dann:

  • Änderung oder eine Funktion oder Klassendefinition hinzufügen
  • C-c C-c es in das Bild zu kompilieren und laden
  • Schalter auf REPL, Test
  • debug

Es gibt keine signifikante Zusammenstellung Pausen, weil ich noch nie auf einmal die ganze Sache kompilieren, nur einzelne Definitionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top