В данный момент я работаю через "Практический язык Common LISP" от Peter Seibel.
В главе, "Практичной: Простая База данных" (http://www.gigamonkeys.com/book/practical-a-simple-database.html) Seibel объясняет ключевые параметры и использование предоставленного параметра со следующим примером:
(defun foo (&key a (b 20) (c 30 c-p)) (list a b c c-p))
Результаты:
(foo :a 1 :b 2 :c 3) ==> (1 2 3 T)
(foo :c 3 :b 2 :a 1) ==> (1 2 3 T)
(foo :a 1 :c 3) ==> (1 20 3 T)
(foo) ==> (NIL 20 30 NIL)
Таким образом, если я использую &key в начале своего списка параметров, у меня есть возможность использовать список 3 имен параметров, значения по умолчанию и третьего если параметр, как предоставлено или нет. Хорошо. Но смотря на код в вышеупомянутом примере:
(list a b c c-p)
Как интерпретатор шепелявости знает, что c-p является моим "предоставленным параметром"?
Давайте изменим отступ функции foo :
(defun foo (&key a
(b 20)
(c 30 c-p))
(list a b c c-p))
Если вы сделаете такой отступ, то увидите, что функция имеет три параметра ключевого слова: а, б и в. Они доступны в теле функции.
Для параметра ключевого слова c объявлена переменная c-p , которая будет иметь значение 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-provided-p позволяет увидеть, исходит ли значение NIL переменной init-value из значения по умолчанию или из вызова функции.
Трудно сказать, о чем вы спрашиваете. c-p
привязан к T
или NIL
, в зависимости от того, предоставляется ли c
в качестве параметра. Затем эта привязка становится доступной для тела функции.