LISP: параметры ключевого слова, поставляемого p - PullRequest
10 голосов
/ 29 апреля 2010

В данный момент я работаю через "Practical Common Lisp" от Питера Сейбела.

В главе «Практическая: простая база данных» (http://www.gigamonkeys.com/book/practical-a-simple-database.html) Сейбель объясняет параметры ключевых слов и использование предоставленного параметра в следующем примере:

(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)

Так что, если я использую & ключ в начале моего списка параметров, у меня есть возможность использовать список из 3 параметров: имя, значение по умолчанию и третий, если параметр предоставлен или нет. Хорошо. Но, глядя на код в приведенном выше примере:

(list a b c c-p)

Как интерпретатор lisp узнает, что c-p - это мой "предоставленный параметр"?

Ответы [ 2 ]

15 голосов
/ 29 апреля 2010

Давайте переопределим функцию 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.

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

  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-supplies-p позволяет увидеть, является ли значение NIL переменной init-value значением по умолчанию или из вызова функции.

5 голосов
/ 29 апреля 2010

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

...