Shammer's Philosophy

My private adversaria

コマンドライン引数をKeywordのように扱うには?その4

コマンドライン引数をKeywordのように扱うには?その3 - Shammerismで、どうにかコマンドライン引数をKeywordのように扱うことができるようになった。実際、この方法で作成した Keyword 引数を、自分で用意した Keyword 引数を必要とする関数に渡してうまく処理させることができるかをやってみる。自作の Keyword 引数を必要とする関数の定義は以下。

(defun hello (&key (name "Taro") (job "Engineer"))
  (format t "I'm ~A, my job is ~A.~%" name job))

まあ、簡単な自己紹介文みたいなものだ。この関数に Keyword 引数を渡してみる。

(defun main ()
  (let ((args (cdr (member "--" *command-line-argument-list* :test 'string-equal))))
    (let (new-list)
      (dolist (x args)
	(if (char= #\: (aref x 0))
	    (setf new-list
		  (append new-list (list (intern (subseq (string-upcase x) 1) :keyword))))
	    (setf new-list
		  (append new-list (list x)))))
      (apply #'hello new-list))))

ほぼほぼ前回と同じだが、余計な format を削除して、キーワード引数になるところを間違えて小文字にしてしまっても平気なように string-upcase も入れた。これを

(save-application "test" :toplevel-function #'main :prepend-kernel t)

コンパイルして、実行してみた結果が以下。

$ ccl64 -l main.lisp
$ ./test --
I'm Taro, my job is Engineer.
$ ./test -- :name Jiro :job Police
I'm Jiro, my job is Police.
$ ./test -- :job Police
I'm Taro, my job is Police.
$ ./test -- :name Jiro
I'm Jiro, my job is Engineer.
$