Давайте переопределим функцию foo :
(defun foo (&key a
(b 20)
(c 30 c-p))
(list a b c c-p))
Если вы сделаете отступ таким образом, вы увидите, что функция имеет три ключевых параметра: a, b и c. Они доступны в теле функции.
Для параметра ключевого слова c существует объявленная переменная cp , которая будет иметь значение T или NIL в зависимости от того, была ли передана c при вызове foo.
Параметр ключевого слова обычно может быть объявлен как один из следующих параметров:
- как имя одной переменной
- список имени переменной и значения по умолчанию
- список имени переменной, значения по умолчанию и переменной, которая покажет, был ли передан параметр или нет при вызове функции
Предоставляемый p особенно интересен, когда нужно посмотреть, получено ли значение из вызова или значение по умолчанию:
(defun make-my-array (size &key (init-value nil init-value-supplied-p))
(if init-value-supplied-p
(make-array size :initial-element init-value)
(make-array size)))
Теперь пользователь может инициализировать элементы в NIL:
(make-my-array 10 :init-value nil)
Здесь значение по умолчанию и предоставленное значение могут быть равны NIL, но мы должны внести разницу. Переменная init-value-supplies-p позволяет увидеть, является ли значение NIL переменной init-value значением по умолчанию или из вызова функции.