방금 Clojure (Ruby에서 온)로 시작했고 명령 줄 인터페이스가있는 작은 앱을 만들고 싶습니다. CL에 대한 입력 / 출력을 어떻게 처리합니까?
나는 clojure.contrib.command-line이 있다는 것을 알아 챘지만 문서는 희박합니다.
방금 Clojure (Ruby에서 온)로 시작했고 명령 줄 인터페이스가있는 작은 앱을 만들고 싶습니다. CL에 대한 입력 / 출력을 어떻게 처리합니까?
나는 clojure.contrib.command-line이 있다는 것을 알아 챘지만 문서는 희박합니다.
답변:
다음은 해당 with-command-line
매크로 를 사용하는 예입니다 . 다음 코드는 명령 줄 인수의 값만 출력하는 기본 메서드를 사용하여 간단한 클래스를 지정합니다.
(ns cmd-line-demo
(:gen-class)
(:use clojure.contrib.command-line))
(defn -main [& args]
(with-command-line args
"Command line demo"
[[foo "This is the description for foo" 1]
[bar "This is the description for bar" 2]
[boolean? b? "This is a boolean flag."]
remaining]
(println "foo: " foo)
(println "bar: " bar)
(println "boolean?: " boolean?)
(println "remaining: " remaining)))
REPL에서 클래스를 컴파일합니다.
user> (compile 'cmd-line-demo)
cmd-line-demo
1) 명령 줄 인수없이 실행하면 도움말 정보가 표시됩니다. 도움말 정보는 --help
또는 -h
플래그 로 표시 될 수도 있습니다 . 도움말 정보는 cmdspec에서 자동으로 생성됩니다.
$ java -classpath . cmd_line_demo
Command line demo
Options
--foo <arg> This is the description for foo [default 1]
--bar <arg> This is the description for bar [default 2]
--boolean, -b This is a boolean flag.
2) 지정되지 않은 인수는 cmdspec 바인딩에 지정된대로 기본값을받습니다. 예를 들어 bar
의 기본값은 2
입니다.
$ java -classpath . cmd_line_demo --foo "changed value"
foo: changed value
bar: 2
boolean?: nil
remaining: []
3) 부울 플래그는 접미사 "?"로 표시됩니다. cmdspec에서. 플래그 자체 에는 "?"가 포함 되지 않습니다. 이름의 일부로.
$ java -classpath . cmd_line_demo -boolean
foo: 1
bar: 2
boolean?: true
remaining: []
4) 또한 cmdspec에 여러 기호를 지정하여 플래그 별칭을 지정할 수 있습니다. 나는 boolean?
및 b?
플래그로 이것을 수행했습니다 .
5) 마지막으로 remaining
연관된 플래그없이 나머지 모든 인수 를 캡처하도록 지정했습니다 .
$ java -classpath . cmd_line_demo -foo test file1 file2 file3
foo: test
bar: 2
boolean?: nil
remaining: [file1 file2 file3]
이전 clojure.contrib. 명령 줄이 tools.cli로 대체되었습니다.
https://github.com/clojure/tools.cli
tools.cli는 clargon이라고 불렀습니다. 다음은 tools.cli 사용 예제를 제공하는 두 개의 블로그 게시물입니다 (clargon에 대한 모든 참조를 tools.cli로 간단하게 바꾸십시오. 게시물은 오래되었습니다).
질문이 제기 된 후 오랫동안 docopt
CLI 인터페이스를 구축 할 때 라이브러리 사용을 제안 할 수 있습니다. Clojure를위한 것이 있습니다 -docopt.clj
docopt는 프로그램 인터페이스 설명을위한 도움말 메시지와 매뉴얼 페이지에서 수십 년 동안 사용 된 규칙을 기반으로합니다. docopt의 인터페이스 설명은 이러한 도움말 메시지이지만 형식화되었습니다.
따라서 인터페이스 를 선언 하고 동시에 문서화 할 수 있습니다 . 놀랍고도 쉽습니다.
자세한 내용은 http://docopt.org/ 를 확인하는 것이 좋습니다.
또한 인터페이스 http://try.docopt.org/ 를 확인하는 온라인 앱이 있습니다.
마지막으로 Clojure lib를 사용하는 방법의 예가 있습니다.
어쩌면 jark를 시도하십시오. Jark는 영구 JVM에서 clojure 프로그램을 실행하는 도구입니다. 유용한 명령 줄 유틸리티가 있습니다.
jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args