Когда дело доходит до разделения, я бы держал их в отдельных пространствах имен / файлах:
- Один для пространства имен
:gen-class
, содержащий -main
и все другие подобные Java вещи.
- Другое пространство имен для всех функций.
В идеале ваш main должен содержать только вызов функции из другого пространства имен или, возможно, некоторую логику для оценки или перепаковки args
.
Ваш вопрос кажется очень похожим на разделение между кодом логики и кодом пользовательского интерфейса. Вы могли видеть пространство имен с :gen-class
как просто интерфейс, предоставленный вашей программой для Java-кода, ничего более.
Когда дело доходит до утилит (таких как командная строка, приложения Swing и т. Д.), Проблема с Java в целом возникает из-за времени запуска JVM.
Теперь вы можете решить эту проблему, заставив серверное приложение постоянно выполнять REPL в фоновом режиме и, скажем, каким-то образом получать s-expr для оценки и возвращать результат. Это можно сделать как простое веб-приложение, которое получает s-expr в качестве параметра URL и возвращает результат. Теперь вы можете использовать все утилиты на старой Java или использовать bash с помощью wget, поскольку все, что вам нужно сделать, - это получить доступ к URL (при условии, что сервер с repl работает в фоновом режиме).
Есть хороший шанс, что что-то подобное уже существует, так что если кто-то знает - комментарии приветствуются.
Да, и еще одна вещь, порт, на котором выставлено repl webapp, вероятно, должен быть закрыт для внешнего мира, чтобы предотвратить инъекции Clojure: D