Аргументы ключевого слова всегда необязательны, поэтому вам нужно вручную проверить, заданы ли они, и при необходимости сигнализировать об ошибке. Однако было бы лучше не требовать аргументы ключевого слова. Компилятор не распознает их как требуемый и, следовательно, не выдаст вам сообщение об ошибке при отсутствии аргументов во время компиляции.
Если вы действительно хотите, чтобы они требовались, вы можете указать аргументы с помощью трехэлементного списка; первый элемент является аргументом, второй - значением по умолчанию, а третий - переменной, которая будет истинной, если аргумент был указан. Проверка третьего элемента лучше, чем проверка самого ключевого слова, потому что тогда вы можете определить разницу между NIL
, которое было по умолчанию, и NIL
, которое пользователь указал в качестве аргумента.
(defun foo (&key (keyarg nil keyargp))
(unless keyargp (error "KEYARG is required."))
(* keyarg 2))
Изменить
Теперь, когда я думаю об этом немного больше, на самом деле есть способ получить ошибки времени компиляции из-за отсутствия аргументов ключевого слова. Определите макрос компилятора для функции:
(defun foo (&key a b c d)
(* a b c d))
(define-compiler-macro foo (&whole whole &key (a nil ap) (b nil bp)
(c nil cp) (d nil dp))
(declare (ignore a b c d))
(unless (and ap bp cp dp)
(error "Missing arguments..."))
whole)
person
jkiiski
schedule
25.05.2016