Xây dựng ứng dụng Clojure với giao diện dòng lệnh?


79

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.

http://github.com/richhickey/clojure-contrib/blob/ffa868411cda6c617105b52b4f6f9e0f37ee8c24/src/clojure/contrib/command_line.clj


9
Lưu ý rằng nếu ứng dụng của bạn được chạy thường xuyên, bạn sẽ phải trả chi phí khởi động JVM mỗi lần.
Stuart Sierra

1
@StuartSierra Không với nhỏ giọt
Ben

Câu trả lời:


120

Đây là một ví dụ về việc sử dụng with-command-linemacro 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

Ví dụ sử dụng

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 --helphoặc -hcờ. 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ụ: barcó 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?b?cờ.

5) Cuối cùng, tôi đã chỉ định rằng remainingnắ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]

Tuyệt vời, đó chính xác là những gì tôi đang tìm kiếm. Rất kỹ lưỡng. Tôi hy vọng điều này đứng tốt trên Google :)
DMIX

1
Đây thực sự là ví dụ tuyệt vời nhất về điều này đang tồn tại.
Alex Miller

9
Đối với Clojure 1.3, mọi người có thể nên bắt đầu sử dụng tools.cli (đóng góp mới). Xem dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Gogithub.com/clojure/tools.cli
semperos

33

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ũ

Bài tập trung vào Clargon của tác giả gốc


12

Tôi muốn nói thêm rằng bạn có thể làm

(apply -main *command-line-args*)

bên dưới (defn -main ...)để làm cho nó hoạt động ở chế độ thông dịch.


7

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 docoptcá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.


1

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.

https://clojars.org/jark

jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.