CLでSRFI-37 — #:g1

Posted 2012-03-10 12:48:00 GMT

CLでSRFI、今回は、SRFI-37の「args-fold: a program argument processor」です。
シェルスクリプトで利用する場合における与えられた引数の処理についてのSRFIです。

動作

#!/usr/bin/env sbcl-srfi-22

(defvar options (list (option '(#\d "debug") 'NIL 'T (lambda (option name arg debug batch paths files) (list option name arg debug batch paths files) (values (or arg "2") batch paths files) )) (option '(#\b "batch") 'NIL 'NIL (cl:lambda (option name arg debug batch paths files) (list option name arg debug batch paths files) (values debug 'T paths files) )) (option '(#\I "include") 'T 'NIL (lambda (option name arg debug batch paths files) (list option name arg debug batch paths files) (values debug batch (cons arg paths) files) ))))

(defun main (args) (multiple-value-bind (debug-level batch-mode include-paths files) (args-fold (cdr args) options (lambda (option name arg &rest seeds) ;; unrecognized (list option name arg seeds) (error "Unrecognized option:~A" name) ) (lambda (operand debug batch paths files) ;; operand (list operand debug batch paths files) (values debug batch paths (cons operand files))) 0 ; default value of debug level 'NIL ; default value of batch mode '() ; initial value of include paths '() ; initial value of files ) (format t "debug level = ~A~%" debug-level) (format t "batch mode = ~A~%" batch-mode) (format t "include paths = ~A~%" (reverse include-paths)) (format t "files = ~A~%" (reverse files)) 0))

というようなスクリプトで、
% ~/bin/srfi-37-test -d1 -b -I/tmp -I/var/tmp foo bar baz
debug level = 1
batch mode = T
include paths = (/tmp /var/tmp)
files = (foo bar baz)
みたいなことができます。

移植について

SRFI-22と組み合わせて使う場合、都度読み込むと起動が遅くなるので、SRFI-37も一緒に読み込んだイメージを作成すると良いかなと思いました。
良いかなというより、寧ろこうしないと使いづらいですね。 ■

comments powered by Disqus