2016-01-29 19 views
2

參數:KEY包含在Common Lisp附帶的一些函數中。我發現的所有描述都是無益的,並且:KEY很難在搜索引擎中搜索,因爲通常會忽略「:」。Common Lisp:KEY參數使用

它將如何使用,例如,在允許:TEST:KEYmember函數中?

+1

的Common Lisp的HyperSpec有一個索引頁。您在索引頁上找到':key'非字母:http://www.lispworks.com/documentation/HyperSpec/Front/X_Mast_9.htm –

回答

5

:key參數是一個參數的函數;它應用於序列的每個元素以生成用於測試的值。如果省略,則使用身份識別功能。

下面是來自CLHS一個例子:

(member 2 '((1 . 2) (3 . 4)) :test-not #'= :key #'cdr) => ((3 . 4)) 
6

: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中存在至少一個該名稱的對象,則返回第一個這樣的對象。