問題不在使用關鍵字,但實際上關於關鍵字執行。例如,當我創建關鍵字參數的一些功能,並撥打電話:關鍵字如何在Common Lisp中工作?
(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中有關於關鍵字的一些手冊以及它們的機制的解釋,如果您在此發佈鏈接,我將不勝感激,因爲我只能找到一些關於關鍵字使用的簡短文章。
謝謝!現在一切都很清楚,這真的很有幫助! – TheEnt
@Barmar *「**(defun fun(&key key-param)...)**實際上是:**(defun fun(&key((:key-param key-param)))...) **「*,除了第一個之後,一個名爲」KEY-PARAM「的符號尚未在關鍵字包中實現(至少根據OP的抄本)。如果它是擴展arglist的簡寫(也許一個實現可以這樣做;我不確定它是否被允許),那麼關鍵字將在宏擴展時被實施。 (這不是特別重要,但它確實指出了「泄漏」(或不)defun的一些實現。) –