LISP: Ключевые параметры, предоставленные-p

В данный момент я работаю через "Практический язык 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 является моим "предоставленным параметром"?

10
задан echox 29 April 2010 в 09:12
поделиться

2 ответа

Давайте изменим отступ функции foo :

(defun foo (&key a
                 (b 20)
                 (c 30 c-p))
   (list a b c c-p))

Если вы сделаете такой отступ, то увидите, что функция имеет три параметра ключевого слова: а, б и в. Они доступны в теле функции.

Для параметра ключевого слова c объявлена ​​переменная c-p , которая будет иметь значение T или NIL в зависимости от того, было ли передано c при вызове foo.

Параметр ключевого слова обычно может быть объявлен как одна из следующих опций:

  1. как одно имя переменной
  2. список имени переменной и значение по умолчанию
  3. список имени переменной, значение по умолчанию значение и переменная, которая покажет, был ли параметр передан или нет при вызове функции

Поставляемый-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 из значения по умолчанию или из вызова функции.

15
ответ дан 3 December 2019 в 19:32
поделиться

Трудно сказать, о чем вы спрашиваете. c-p привязан к T или NIL , в зависимости от того, предоставляется ли c в качестве параметра. Затем эта привязка становится доступной для тела функции.

5
ответ дан 3 December 2019 в 19:32
поделиться