2010-12-13 2 views
4

Извините за длинный пост, но этот форум всегда запрашивает варианты использования :-).Clojure REPL философия и утилиты

Я часто призываю писать служебные приложения (GUI и командную строку) для моей организации. Я чаще всего пишу их на Java и совсем недавно Scala.

«Философия» в Clojure (и других Lisp), кажется, сосредоточена вокруг REPL, и я должен согласиться с тем, что она создает приятную среду разработки, но я, очевидно, не могу производить утилиты, требующие от пользователей «Install Clojure and Clojure-contrib, затем распакуйте утилиту в каталог на вашем жестком диске, запустите Clojure из командной строки, используя следующий путь к классам ... ». Пользователям все равно, что утилита написана на Clojure. Они просто хотят указать и нажать или, самое большее, введите «java -jar Utility.jar -?» в командной строке.

Мой вопрос сосредотачивается вокруг компиляции и разделения приложения на множество пространств имен/файлов.

Я знаю, что метод main должен быть в файле Clojure, который включает в себя (gen-class...) команду (или положение о команде ns:gen-class). Я делаю то же самое для дополнительных файлов Clojure, или их следует оставить в качестве исходного кода, который упакован в JAR и загружен файлом main? Как насчет тестирования дополнительных файлов из REPL во время разработки?

Я использую leiningen, cake и maven для создания автономных JAR (содержащих распакованные файлы clojure.jar, clojure-contrib.jar и commons-cli.jar), но до сих пор я писал свои код в том же файле, что и метод main.

ответ

1

Это зависит от вас, хотите ли вы AOT-компилировать свой .clj в .class или позволить Clojure делать это динамически во время выполнения. В общем, я считаю, что во время разработки легче избегать AOT и просто использовать AOT в качестве ускорителя производительности для случаев, когда затраты на компиляцию вашего .clj на лету не имеют смысла (ограниченные среды, такие как Google App Engine или утилиты, где время запуска имеет решающее значение). Для серверных процессов, которые будут работать в течение длительного времени, в AOT-компиляции не так много преимуществ.

Существует множество сложностей, связанных с использованием классов AOT в разное время, которые характерны для разных сред Dev.

Одна из сторон AOT заключается в том, что ваши скомпилированные классы могут быть несовместимы с будущей версией Clojure, и это более вероятно, чем ваши файлы clj, несовместимые. Это может стать более важным с течением времени.

1

Когда дело доходит до разделения, я бы держать их в отдельных пространствах имен/файлов:

  • один для :gen-class имен, содержащих -main и все другие Java-подобные вещи.
  • Другое пространство имен для всех функций.

В идеале ваш главный должен содержать только вызов функции из другого пространства имен, или, возможно, некоторые логики для оценки или переупаковки в args.

Ваш вопрос кажется очень похожим на разделение между логическим кодом и кодом ui. Вы могли видеть пространство имен с :gen-class как просто интерфейс, предоставляемый вашей программой Java-коде, и ничего более.


Когда дело доходит до утилит (например, из командной строки, или Swing-приложений и т.д.), есть проблема с Java в целом из-за JVM время запуска.

Теперь вы можете получить , разрешив это серверным приложением заново запустить REPL в фоновом режиме и сказать, как-то получить оценку s-expr и вернуть результат. Это можно сделать как простое веб-приложение, которое получает параметр s-expr как URL-адрес и возвращает результат. Теперь с этим вы можете сделать все утилиты в простой старой Java или даже bash с помощью wget, так как все, что вам нужно сделать, это получить доступ к URL-адресу (при условии, что сервер с repl работает в фоновом режиме).

Есть хороший шанс, что что-то вроде этого уже существует, поэтому, если кто знает, комментарии более чем приветствуются.

О, и еще одна вещь, порт, в котором подвергается РЕПЛ WebApp, вероятно, должны быть закрыты для внешнего мира, чтобы предотвратить Clojure-инъекции: D

+0

Не можете сделать веб-приложение. У нас есть серверы по всей стране - за пределами брандмауэра, и мне нужно управлять коммунальными услугами там, а также в нашей штаб-квартире. Время запуска никогда не было проблемой для приложений Java; большинство из них - утилиты DB, которые делают много вещей с запросами и т. д. - БД обычно является узким местом. Спасибо за ответ. – Ralph

+0

@Ralph: Хорошо, я добавил строку, разделяющую верхнюю часть, которая по-прежнему актуальна для вашего вопроса, из нижней части, которая не применима в вашем случае. –

Смежные вопросы