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