Clojure 스크립트를 명령 줄에서 계속 실행하는 것은 관용적이지 않습니다. REPL은 더 나은 명령 행입니다. Clojure는 Lisp이기 때문에 Clojure를 실행하고 동일한 인스턴스를 영원히 계속 실행하고 다시 시작하지 않고 상호 작용하는 것이 일반적입니다. 실행중인 인스턴스의 기능을 한 번에 하나씩 변경하고 실행하고 필요에 따라 펑크 할 수 있습니다. 지루하고 느린 전통적인 편집/컴파일/디버그주기를 피하는 것이 Lisps의 큰 특징입니다.
단위 테스트 실행과 같은 기능을 쉽게 작성할 수 있으며 실행하고 싶을 때마다 REPL에서 해당 함수를 호출 할 수 있습니다. Clojure에서는 clojure.contrib.test-is
을 사용하고 테스트 함수를 네임 스페이스에 추가 한 다음 clojure.contrib.test-is/run-tests
을 사용하여 모두 실행합니다.
Clojure를 명령 줄에서 실행하지 않는 또 다른 이유는 JVM의 시작 시간이 길어질 수 있다는 것입니다.
명령 줄에서 Clojure 스크립트를 실제로 실행하려면 여러 가지 방법이 있습니다. 자세한 내용은 the Clojure mailing list을 참조하십시오.
한 가지 방법은 명령 줄 인수가 있는지 테스트하는 것입니다. 현재 디렉토리에서이 foo.clj
을 감안할 때 :
(ns foo)
(defn hello [x] (println "Hello," x))
(if *command-line-args*
(hello "command line")
(hello "REPL"))
당신은 Clojure를 시작하는 방법을 따라 다른 동작을 얻을 수 있습니다. 당신이 작동하는 방법을보고 싶다면
$ java -cp ~/path/to/clojure.jar:. clojure.main foo.clj --
Hello, command line
$ java -cp ~/path/to/clojure.jar:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (use 'foo)
Hello, REPL
nil
user=>
는 Clojure의 소스에 src/clj/clojure/main.clj
를 참조하십시오.
또 다른 방법은 코드를 .class
개의 파일로 컴파일하고 Java 명령 줄에서 호출하는 것입니다. 소스 파일 foo.clj
감안할 때 :
(ns foo
(:gen-class))
(defn hello [x] (println "Hello," x))
(defn -main [] (hello "command line"))
컴파일 된 .class
파일을 저장할 디렉토리를 확인; 기본값은 ./classes
입니다. 이 폴더는 직접 만들어야하며 Clojure는이 폴더를 만들지 않습니다. 또한 $CLASSPATH
에 ./classes
과 소스 코드가 포함 된 디렉토리를 포함하도록 설정해야합니다. foo.clj
이 현재 디렉토리에 있다고 가정합니다. 명령 줄에서 그래서 다음 classes
디렉토리에서
$ mkdir classes
$ java -cp ~/path/to/clojure.jar:./classes:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (compile 'foo)
foo
지금 .class
파일들을 것입니다.
$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.
clojure.org에 Clojure의 코드를 컴파일에 대한 많은 정보가있다 : (기본적으로 -main
기능을 실행) 명령 줄에서 코드를 호출합니다. 당신은 "진입 점"을 가지고 얘기하는 경우
필자는 * 기능 *이 좋지 않다고 생각합니다. * 기능 * 일부 환경 상태 또는 코드 실행 요청이 아닌 사용 가능한 기능을 표시합니다. –
왜 안 되니? * 기능 * 모든 종류의 물건에 사용 : 하드웨어가 실행되고있는 하드웨어, 사용 가능한 일부 핵심 라이브러리, 소프트웨어의 일부 모드, Lisp 구현 버전, 언어 버전 여부 : 제작 여부 - 모드 또는 : 개발 모드 등 –