キーワード引数

引数に関数を適用する際に、引数に名前みたいなもの(= キーワード)をつけられる。
そのおかげで、引数の順番を覚えておかなくてもよくなるらしい。引数が多い場合に便利そう?
この概念は始めて出会うなぁ。スクリプト言語にはあったりするのかな。
ってことで、使い方は

(let-keywords args ((キーワード1 値1
                    (キーワード2 値2
                    ...
                    (キーワードn 値n))
                   let-keywords式の値となるS式)

let-optionals*の時と同じ構造をしてる。
let-optionals*の時と同様に、「let-keywords式の値となるS式」ではキーワード1〜nを変数名として使える。
キーワード1〜nの束縛のルールもlet-optionals*の時とおなじ。


let-keywordsを使って関数定義してみると

(define print-score
  (lambda args
    (let-keywords
      args
      ((name "Anonymous")
       (score "unknown"))
      (print name ": score=" score))))

こんな感じで、この関数を使うには

gosh> (print-score :name "yagiey" :score 42)
yagiey: score=42
#<undef>
gosh> (print-score :name "foobar")
foobar: score=unknown
#<undef>
gosh> (print-score :score 10)
Anonymous: score=10
#<undef>
gosh> (print-score)
Anonymous: score=unknown
#<undef>
gosh> (print-score "baz" 20)
*** ERROR: unknown keyword "baz"
Stack Trace:
_______________________________________
  0  (errorf "unknown keyword ~S" (car args7))
        [unknown location]

ってな具合になる。キーワードは必ずコロンから始めるのが決まり。
省略可能引数としての機能も持ち合わせているようだなぁ。
あと、最後の例ように、普通の関数みたいに引数だけ並べるのはNGみたい。
引数を渡す場合は、必ずキーワードを伴って渡さないとエラーになるっぽい。

追記:認識できなかったキーワード引数

(let-keywords args ((キーワード1 値1
                    (キーワード2 値2
                    ...
                    (キーワードn 値n) . others)
                   let-keywords式の値となるS式)

ってすれば、キーワードを知らないキーワードとともに渡された引数がまとめてothersに束縛される。
んでもって、「let-keywords式の値となるS式」の中で使える。