2016-08-31 10 views

答えて

7

unix-optionsを試すことができます。

(ql:quickload :unix-options) 

(defpackage :test 
    (:use :cl) 
    (:import-from :unix-options 
       :&parameters 
       :&free 
       :with-cli-options)) 

あなたは、おそらくパッケージを:useしたいのですが、あなたはそれからシンボルをインポートすることを好む場合、およそ&free&parametersを忘れないでください。 ライブラリは、従来のgetoptユーティリティと同様のgetopt関数を定義しています。しかしそれはまたwith-cli-optionsを定義します、これはもう少しぼんやりしています。

  • 最初のシンボルセットはオプション、つまり存在しないか存在するフラグを定義します。
  • &parameters以降のシンボルは、パラメータの後に値を指定する必要があります。
  • のいずれかのオプションやパラメータは、例えば&free

で指定された変数にバインドされたリストで使用可能なとして認識されない引数:

(in-package :test) 

(defun my-program (&rest cli-args) 
    (with-cli-options (cli-args) 
     (x y z &parameters a b &free other) 
    (list x y z a b other)))) 

ここで私はプログラムのエントリポイントを定義します。実際のプログラムでは、あなたは、単にこのように、空の最初のリストを残すことができます。

(with-cli-options() <bindings> <body>) 

...とオプションは、あなたのLispの実装の実際のコマンドライン引数からポータブルにフェッチされます。 (uiop:command-line-arguments)に電話して完全なコマンドラインを使用することもできます。これは、より多くの実装をサポートしているように見え、最初の要素としてプログラムの名前が含まれています。 上記の関数を使用すると、パーサの動作をテストできます。短いオプションが分離または結合することができることを例えば 注:

(my-program "-xyz" "-a" "2" "-b" "3" "--" "something") 
=> (T T T "2" "3" ("something")) 

(my-program "-x" "-y" "-z" "-a" "2" "-b" "3" "--" "something") 
=> (T T T "2" "3" ("something")) 

がパラメータとして宣言されているが、実際の値を与えられていないオプションについては注意してください(多分彼らはや、ケースはあいまいです):

(my-program "-a" "-b") 
=> (NIL NIL NIL "-b" NIL NIL) 

未知のパラメータのための警告があります

(ignore-errors (my-program "-w")) 
; WARNING: Invalid option: w 
=> (NIL NIL NIL NIL NIL NIL) 

は詳細についてはドキュメントを参照してください。

+0

ありがとうございました。これはかなりいいようです、私はこの解決策を検討します。 – MatthewRock

+4

また、これを実行可能ファイルとして出荷する予定がある場合は、uiopの 'command-line-arguments'関数を参照することもできます。 – Baggers

+0

@Baggers Updated、thanks。 – coredump

関連する問題