Common Lispでコマンドライン引数を取得する
-
06-07-2019 - |
質問
Common Lisp(違いがある場合は具体的にはGNU)でコマンドライン引数を取得するにはどうすればよいですか?
解決
CLispでスクリプトを作成していると仮定しています。を含むファイルを作成できます
#! /usr/local/bin/clisp
(format t "~&~S~&" *args*)
実行して実行可能にします
$ chmod 755 <filename>
実行すると次のようになります
$ ./<filename>
NIL
$ ./<filename> a b c
("a" "b" "c")
$ ./<filename> "a b c" 1 2 3
("a b c" "1" "2" "3")
他のヒント
http://cl-cookbook.sourceforge.net/os.html はいくつかの洞察
(defun my-command-line ()
(or
#+CLISP *args*
#+SBCL *posix-argv*
#+LISPWORKS system:*line-arguments-list*
#+CMU extensions:*command-line-words*
nil))
はあなたが探しているものだと思います。
ClispまたはGCLについて話しているのですか? GCLでは、コマンドライン引数が si :: * command-args *
で渡されるようです。
SBCLでは、sb-ext:* posix-argv *を使用して、一般的なLispスクリプトからargvを取得できます。 sb-ext:* posix-argv *はすべての引数を保持するリストです。最初の引数はスクリプトfilnameです。
各実装のメカニズムを抽象化する前述のClonライブラリがあり、現在はより簡単な unix-opts 、およびクックブックのチュートリアル。
(ql:quickload "unix-opts")
(opts:define-opts
(:name :help
:description "print this help text"
:short #\h
:long "help")
(:name :nb
:description "here we want a number argument"
:short #\n
:long "nb"
:arg-parser #'parse-integer) ;; <- takes an argument
(:name :info
:description "info"
:short #\i
:long "info"))
その後、実際の解析は(opts:get-opts)
で行われ、2つの値が返されます:オプションと残りの自由な引数。
https://stackoverflow.com/a/1021843/31615 で見られるように、各実装には独自のメカニズムがあります。これに対処する通常の方法は、統一されたインターフェースを提供するラッパーライブラリを使用することです。
このようなライブラリは、物を読み込むだけでなく、それらを変換し、ユーザーに役立つ出力を提供するためのさらなる支援を提供できます。完全なパッケージはCLON(CLONまたはCLONと混同しないでください、申し訳ありません)、コマンドラインオプションNuker 。詳細なドキュメントもあります。ただし、たとえば command-line-arguments および apply-argv 。
これらのquicklispのパッケージは、それぞれ net.didierverna.clon
、 command-line-arguments
、および apply-argv
という名前です。 。