Вопрос не в использовании ключевых слов, а в действительности о реализации ключевых слов. Например, когда я создаю некоторую функцию с параметрами ключевого слова и делаю вызов
(defun fun (&key key-param) (print key-param)) => FUN
(find-symbol "KEY-PARAM" 'keyword) => NIL, NIL ;;keyword is not still registered
(fun :key-param 1) => 1
(find-symbol "KEY-PARAM" 'keyword) => :KEY-PARAM, :EXTERNAL
Как использовать ключевое слово для передачи аргумента? Ключевые слова являются символами, значения которых сами по себе, поэтому как связать соответствующий параметр с помощью ключевого слова?
Другой вопрос о ключевых словах - ключевые слова используются для определения пакетов. Мы можем определить пакет с уже существующим ключевым словом
(defpackage :KEY-PARAM) => #<The KEY-PARAMETER package, 0/16 ...
(in-package :KEY-PARAM) => #<The KEY-PARAMETER package, 0/16 ...
(defun fun (&key key-param) (print key-param)) => FUN
(fun :KEY-PARAM 1) => 1
Как система отличает использование :KEY-PARAM
между именем пакета и именем параметра функции?
Также мы можем сделать что-то более сложное, если мы определим функцию KEY-PARAM
и экспортируем ее (фактически не функцию, а имя)
(in-package :KEY-PARAM)
(defun KEY-PARAM (&key KEY-PARAM) KEY-PARAM) => KEY-PARAM
(defpackage :KEY-PARAM (:export :KEY-PARAM))
;;exporting function KEY-PARAM, :KEY-PARAM keyword is used for it
(in-package :CL-USER) => #<The COMMON-LISP-USER package, ...
(KEY-PARAM:KEY-PARAM :KEY-PARAM 1) => 1
;;calling a function KEY-PARAM from :KEY-PARAM package with :KEY-PARAM parameter...
Вопрос тот же, как Common Lisp отличает использование ключевого слова: KEY-PARAM здесь?
Если есть несколько руководств по ключевым словам в Common Lisp с объяснением их механики, я был бы признателен, если бы вы разместили ссылку здесь, потому что я мог найти только некоторые короткие статьи только об использовании ключевых слов.