キーワード引数を使って大域変数を束縛する - lisp-cookbook-ja/common-lisp GitHub Wiki

キーワード引数で受けとった値を大域変数に束縛することがあります

(defun print-bar (obj &key (base 10))
  (let ((*print-base* base))
    (print obj)))

(print-bar 33)
;->
;   33
;=> 33

(print-bar 33 :base 16)
;->
;   21
;=> 33

このような場合は、

(defun print-foo (obj &key ((:base *print-base*) 10))
  (print obj))

(print-foo 33)
;->
;   33
;=> 33

(print-foo 33 :base 16)
;->
;   21
;=> 33

と書くことが可能です。

上記の場合、関数定義フォームのボディ全体が(let ((print-base base)...)で囲まれたと考えることもできるでしょう。(baseという変数は参照できませんが)

議論