问题不在于使用关键字,而实际上是关于关键字实现。例如,当我使用关键字参数创建一些函数并进行调用时:
(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 中关键字的手册并解释了它们的机制,如果您在此处发布链接,我将不胜感激,因为我只能找到一些仅关于关键字用法的简短文章。