參數:KEY
包含在Common Lisp附帶的一些函數中。我發現的所有描述都是無益的,並且:KEY
很難在搜索引擎中搜索,因爲通常會忽略「:」。Common Lisp:KEY參數使用
它將如何使用,例如,在允許:TEST
和:KEY
的member
函數中?
參數:KEY
包含在Common Lisp附帶的一些函數中。我發現的所有描述都是無益的,並且:KEY
很難在搜索引擎中搜索,因爲通常會忽略「:」。Common Lisp:KEY參數使用
它將如何使用,例如,在允許:TEST
和:KEY
的member
函數中?
:key
參數是一個參數的函數;它應用於序列的每個元素以生成用於測試的值。如果省略,則使用身份識別功能。
下面是來自CLHS一個例子:
(member 2 '((1 . 2) (3 . 4)) :test-not #'= :key #'cdr) => ((3 . 4))
的:key
參數記錄,有點含糊,在導言部分,在Common Lisp的HyperSpec的Sequences Library (Section 17),17.2.1 Satisfying a Two-Argument Test以及17.2.2 Satisfying a One-Argument Test下。這是因爲它在整個圖書館的行爲是一致的。
很簡單,:key
指定應用於正在處理的一個或多個序列的元素的函數。函數的返回值用於代替這些元素。在一些功能語言的術語中,這被稱爲「投影」。這些元素通過關鍵功能進行投影。如果你不提供這個參數,你可以想象默認的鍵功能是identity
。
理解一個重要的事情是,在其中接受一些對象參數和一個序列(其搜索對象的發生的序列實例的功能)的功能,關鍵功能是不施加到輸入對象;僅限於序列的元素。
第二件重要的事情是:key
不能替代該項目,僅用於識別該項目的值。例如,即使序列中的項目通過:key
投影到替代鍵,搜索序列中的項目的功能也會從序列中檢索原始項目。鍵功能檢索的值僅用於比較。
E.g.如果obj-list
是可以通過名爲obj-name
的函數訪問名稱的對象的列表,那麼我們可以使用(find "foo" obj-list :key #'obj-name)
查找名爲"foo"
的對象。函數obj-name
應用於每個元素,並將其結果與字符串"foo"
(該函數未應用於此)進行比較。如果obj-list
中存在至少一個該名稱的對象,則返回第一個這樣的對象。
的Common Lisp的HyperSpec有一個索引頁。您在索引頁上找到':key'非字母:http://www.lispworks.com/documentation/HyperSpec/Front/X_Mast_9.htm –