Shammer's Philosophy

My private adversaria

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

コマンドライン引数をKeywordのように扱うには?その1 - Shammerismで intern を使ってみよう、というところで終わっていたが、それをやってみたのでメモ。main 関数は以下のように変更。

(defun main ()
  (let ((x (cdr (member "--" *command-line-argument-list* :test 'string-equal))))
    (format t "param is ~A, param type is ~A~%" x (type-of x))
    (let ((new-list (list (intern (string-upcase (car x)) :keyword) (cadr x))))
      (format t "key is ~A." (getf new-list :key)))))

これをコンパイルして実行。しかし、実行結果は変わらず。

$ ./test -- :key value
param is (:key value), param type is CONS
key is NIL.
$

コロン付の文字をさらにキーワードにしているからいけないのではないか、ということで、引数をコロンなしにして試してみたところうまくいったようだ。

$ ./test -- key value
param is (key value), param type is CONS
key is value.
$

なるほどぉ。なんかもっとスンナリ渡すことのできる方法もありそうな気もするが、、、とりあえずはこれをベースに考えてみる。コマンドライン引数を見るだけで Keyword 引数かそうでないかを判断できるようにしておきたいから、コマンドライン上ではコロン付、コロン付の引数はコロンを外して intern するというようにすればできそうだ。また、上記は引数が一組という前提だが、実際はもっと増えるかもしれないし、Key と Value という組み合わせで渡されず、引数一つで何か意味があるものもあるかもしれない。引数リスト全体を見て最適化を考えていかなければ。