2016-02-09 2 views
0

Я хотел бы создать класс 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?

ответ

2

Я хотел бы предложить, чтобы просто создать script.clj нс, что только имеет вызов core/-main

1

Короткий ответ: нет.

Clojure имеет ровно один и только один способ скомпилировать и запустить код. Нет никакой разницы в том, как программа загружается, если вы запускаете ее из своего REPL, или если вы запускаете ее, не подключая REPL. Clojure - это строго скомпилированный язык, хотя вы можете при запуске его из REPL выбрать, чтобы начать с функции, отличной от main, или передать основной аргумент, если вы хотите, чтобы он был другим.

У меня есть функция в моем основном рабочем проекте под названием dev, который я запускаю в этих случаях (dev короче основного;). Также можно будет проверить наличие соединения nrepl в вашей программе, когда начнется главное, хотя это уходит от обычной практики Clojure.

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

+0

Возможно, мне нужно было по-другому. Мой код обычно не нужно упаковывать в классы, но я отсылаю его из теста, и мне нужно загрузить только 'def' и не выполнять никаких сообщений stdout/stdin. И мне нужен один исходный файл. Считайте это домашней работой) Любые идеи? – Rorick

+0

Вы можете просто позвонить на свою «главную» функцию на верхнем уровне, назовите ее my-main. затем сделайте фактическую основную функцию полностью пустой. это приведет к тому, что «my-main» будет запущен при загрузке пространства имен (шаг до того, как начнется main), а затем при запуске main «main» ничего не сделает, потому что программа уже запущена. –

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