Les arguments des mots-clés sont toujours facultatifs, vous devez donc vérifier manuellement s'ils sont fournis et signaler une erreur si nécessaire. Il serait cependant préférable de ne pas exiger les arguments mots-clés. Le compilateur ne les reconnaîtra pas comme requis et ne vous donnera donc pas de message d'erreur pour les arguments manquants au moment de la compilation.
Si vous voulez les exiger, vous pouvez spécifier les arguments avec une liste de trois éléments ; le premier élément étant l'argument, le deuxième est la valeur par défaut et le troisième est une variable qui sera vraie si l'argument a été donné. Il est préférable de vérifier le troisième élément plutôt que le mot-clé lui-même, car vous pouvez alors faire la différence entre un mot-clé NIL
qui était la valeur par défaut, et un NIL
que l'utilisateur a donné comme argument.
(defun foo (&key (keyarg nil keyargp))
(unless keyargp (error "KEYARG is required."))
(* keyarg 2))
Modifier
Maintenant que j'y pense un peu plus, il existe en fait un moyen d'obtenir des erreurs de compilation pour les arguments de mots-clés manquants. Définissez une macro de compilation pour la fonction :
(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)