Я хотел бы создать класс Clojure, который можно запустить как с помощью метода main
, так и в виде скрипта. Мне не нужны аргументы командной строки в обоих случаях. В настоящее время, у меня есть что-то вроде этого:Сделать класс Clojure доступным как по основному методу, так и по сценарию
(ns my-namespace.core
(:gen-class))
(defn -main
[& args]
(println "Hi"))
; I'd like to have something like (when (in-script?) (-main))
(-main)
В таком виде она является работоспособной, как сценарий, но запустить его как класс показывает Hi
два раза, что не удивительно.
Я ожидал найти способ отличить прогоны, похожие на идиомы Python if __name__ == "__main__":
. Но я только нашел старый discussion, упомянув об этом. К сожалению, подход с *command-line-args*
, описанный там, кажется, не работает. У меня есть nil
независимо от того, как работает как класс или как скрипт.
Так есть способ узнать во время выполнения, если файл Clojure работает как скрипт или через метод main
?
Возможно, мне нужно было по-другому. Мой код обычно не нужно упаковывать в классы, но я отсылаю его из теста, и мне нужно загрузить только 'def' и не выполнять никаких сообщений stdout/stdin. И мне нужен один исходный файл. Считайте это домашней работой) Любые идеи? – Rorick
Вы можете просто позвонить на свою «главную» функцию на верхнем уровне, назовите ее my-main. затем сделайте фактическую основную функцию полностью пустой. это приведет к тому, что «my-main» будет запущен при загрузке пространства имен (шаг до того, как начнется main), а затем при запуске main «main» ничего не сделает, потому что программа уже запущена. –