:KEY
参数包含在 Common Lisp 附带的一些函数中。我找到的所有关于它们的描述都没有帮助,:KEY
很难在搜索引擎中搜索到,因为“:”通常被忽略。
例如,在允许 :TEST
和 :KEY
的 member
函数中如何使用它?
最佳答案
:key
参数在 Sequences Library (Section 17) 的介绍部分中有一些隐秘的记录。在 Common Lisp HyperSpec 中,在 17.2.1 Satisfying a Two-Argument Test 下以及17.2.2 Satisfying a One-Argument Test .这是因为它的行为在整个库中是一致的。
很简单,:key
指定应用于正在处理的一个或多个序列的元素的函数。函数的返回值用于代替这些元素。在一些函数式语言的术语中,这被称为“投影”。元素通过键函数投影。如果不提供此参数,您可以想象默认键函数是 identity
。
要理解的一件重要事情是,在接受一些对象参数和序列的函数中(例如搜索序列以查找对象出现的函数),键函数不应用于输入对象;仅对序列的元素。
第二个重要的事情是 :key
不替代项目,仅替代用于标识项目的值。例如,在序列中搜索项目的函数将从序列中检索原始项目,即使序列的项目通过 :key
投影到替代键。键函数检索的值仅用于比较。
例如如果 obj-list
是一个对象列表,其名称可通过名为 obj-name
的函数访问,我们可能会查找名为 "foo"< 的对象
使用 (find "foo"obj-list :key #'obj-name)
。函数 obj-name
应用于每个元素,并将其结果与字符串 "foo"
(未应用该函数)进行比较。如果 obj-list
中至少存在一个该名称的对象,则返回第一个这样的对象。
关于lisp - 普通口齿不清 :KEY parameter use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35074595/