2010-05-14 7 views
2

Eclipse에서 실행중인 Clojure. 그것을 실행할 때 클로저에 인수를 전달하고 싶습니다. 아래의 인수는 REPL에서 사용할 수 있지만 스크립트 자체에서는 사용할 수 없습니다. 아래에서 REPL의 arg1을 입력하면 첫 번째 인수가 반환됩니다.Clojure : REPL 대신 스크립트에서 * command-line-args * 사용

스크립트 :

Clojure 1.1.0 
1:1 user=> #<Namespace test> 
1:2 test=> arg1 
nil 
1:3 test=> *command-line-args* 
("bird" "dog" "cat" "pig") 
1:4 test=> (def arg2 (nth *command-line-args* 1)) 
#'test/arg2 
1:5 test=> arg2 
"dog" 
1:6 test=> 

답변

3

어쩌면 *command-line-args* 전에 정의되고 arg1이 값을 가져옵니다 당신처럼 보인다

(NS Test) 
(def arg1 (nth *command-line-args* 0)) 

... 이클립스 "실행"을 클릭하면. *command-line-args*clojure.core입니다. 따라서 네임 스페이스를 정의하지 않고 core을 제외하거나 var를 제외시키지 않는 한 모든 네임 스페이스에서 볼 수 있어야합니다. Eclipse가 REPL을 어떻게 시작하는지 또는 네임 스페이스 또는 사용자 코드를로드하는 방법/방법을 알지 못하기 때문에 문제를 알지 못합니다.

하지만 당신은 함수로 arg1를 돌 수 있었다, 그리고 항상 *command-line-args*의 현재 값을 반환해야합니다 (런타임에 해결 될 것이기 때문에, 그리고 *command-line-args* 당신이 함수를 호출 시간에 의해 값이 있어야합니다).

(defn ARGV [n] (nth *command-line-args* n)) 

그런 (ARGV 0), (ARGV 1) 등 사용 (nth *command-line-args* 0) 당신이 더 나은 기능을 쓸 수 자체를 (내가 정말 생각하지 않는) 입력 정말 많은 경우

(defn arg1 [] (nth *command-line-args* 0)) 

더 나은

, 벡터는 그 자체가 인자의 함수이기 때문에, (*command-line-args* n)을 직접 (정확히 말하면 *command-line-args*nil이 아니며, 그렇지 않으면 NullPointerException이 발생합니다.)

def을 많이 사용하면 최상위 수준의 항목에 이름을 할당하는 것이 일반적으로 Clojure에서는 관용적이지 않습니다. 로컬 명령 행 인수를 참조 단지 잠시 동안 그들에게 짧은 이름을 부여하려면, let가있다 : 다시

(defn foo [] 
    (let [arg1 (nth *command-line-args* 0)] 
    ...)) 

, arg1이 (당신이 foo를 호출 할 때마다) 그래서 그것을 실행시에 그 값을 얻어야한다 이런 식으로 작동해야합니다.

+0

브라이언, 제안에 감사드립니다. Eclipse에서 REPL이 시작되는 방식과 확실히 관련이 있습니다. 스크립트를 직접 실행하면 예상대로 작동합니다. FYI, 이유는 모르겠지만 arg1을 함수로 정의하는 설정이 예상대로 작동하지 않습니다. 아래는 새로운 스크립트와 그것을 직접 실행하는 출력입니다. NS (시험) (*에 println 명령 라인 인수 *) (defn이 ARG1 [] (제 n * 명령 라인 인수 * 0)) 하고 실행 ... 자바 -cp/Path_to_jar /clojure.jar clojure.main com.clj cat dog (고양이 개) # (println arg1) –