Tôi chỉ mới bắt đầu w / Clojure (đến từ Ruby) và tôi muốn xây dựng một ứng dụng nhỏ với giao diện dòng lệnh. Làm cách nào để xử lý đầu vào / đầu ra cho CL?
Tôi nhận thấy rằng có một dòng clojure.contrib.command-nhưng tài liệu rất mỏng.
Tôi chỉ mới bắt đầu w / Clojure (đến từ Ruby) và tôi muốn xây dựng một ứng dụng nhỏ với giao diện dòng lệnh. Làm cách nào để xử lý đầu vào / đầu ra cho CL?
Tôi nhận thấy rằng có một dòng clojure.contrib.command-nhưng tài liệu rất mỏng.
Câu trả lời:
Đây là một ví dụ về việc sử dụng with-command-line
macro của nó . Đoạn mã sau chỉ định một lớp tầm thường với một phương thức chính không làm gì khác ngoài việc in ra các giá trị của các đối số dòng lệnh của nó.
(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)))
Biên dịch lớp tại REPL:
user> (compile 'cmd-line-demo)
cmd-line-demo
1) Việc thực thi không có đối số dòng lệnh sẽ khiến thông tin trợ giúp được hiển thị. Thông tin trợ giúp cũng có thể được hiển thị bằng --help
hoặc -h
cờ. Lưu ý rằng thông tin trợ giúp được tạo tự động từ cmdspec của bạn.
$ 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) Các đối số không xác định nhận giá trị mặc định như được chỉ định trong liên kết cmdspec. Ví dụ: bar
có giá trị mặc định là 2
.
$ java -classpath . cmd_line_demo --foo "changed value"
foo: changed value
bar: 2
boolean?: nil
remaining: []
3) Cờ boolean được biểu thị bằng hậu tố "?" trong cmdspec. Lưu ý rằng bản thân lá cờ không bao gồm dấu "?" như một phần của tên của nó.
$ java -classpath . cmd_line_demo -boolean
foo: 1
bar: 2
boolean?: true
remaining: []
4) Cũng lưu ý rằng bạn có thể chỉ định bí danh cờ bằng cách chỉ định nhiều ký hiệu trong cmdspec. Tôi đã làm điều này với boolean?
và b?
cờ.
5) Cuối cùng, tôi đã chỉ định rằng remaining
nắm bắt tất cả các đối số còn lại mà không có cờ liên quan.
$ java -classpath . cmd_line_demo -foo test file1 file2 file3
foo: test
bar: 2
boolean?: nil
remaining: [file1 file2 file3]
Dòng clojure.contrib.command-cũ đã được thay thế bằng tools.cli.
https://github.com/clojure/tools.cli
tools.cli từng được gọi là clargon. Dưới đây là hai bài đăng trên blog đưa ra ví dụ về việc sử dụng tools.cli (thay thế đơn giản bất kỳ tham chiếu nào đến clargon bằng tools.cli. Bài viết đã lỗi thời).
Điều này cho thấy một số cách phương pháp, bao gồm clojure.contrib.command-line cũ
Một thời gian dài sau khi câu hỏi được nêu ra, tôi có thể đề xuất sử dụng docopt
các thư viện khi nói đến việc xây dựng giao diện CLI. Có một cái cho Clojure -docopt.clj
docopt dựa trên các quy ước được sử dụng trong nhiều thập kỷ trong các thông báo trợ giúp và trang người dùng để mô tả giao diện chương trình. Mô tả giao diện trong docopt là một thông báo trợ giúp, nhưng được chính thức hóa
Vì vậy, bạn có thể khai báo giao diện của mình và ghi lại nó cùng một lúc - điều đó thật tuyệt vời và dễ thực hiện.
Để biết thêm chi tiết, tôi khuyên bạn nên xem http://docopt.org/
Ngoài ra, có một ứng dụng trực tuyến để kiểm tra giao diện của bạn http://try.docopt.org/
Và cuối cùng đây là ví dụ của tôi về cách sử dụng Clojure lib.
Có thể thử jark. Jark là một công cụ để chạy các chương trình clojure trên một JVM bền bỉ. Nó có một số tiện ích dòng lệnh hữu ích.
jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args