lisp - 普通口齿不清 :KEY parameter use

标签 lisp common-lisp sequence

:KEY 参数包含在 Common Lisp 附带的一些函数中。我找到的所有关于它们的描述都没有帮助,:KEY 很难在搜索引擎中搜索到,因为“:”通常被忽略。

例如,在允许 :TEST:KEYmember 函数中如何使用它?

最佳答案

: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/

相关文章:

lisp - 从长度为 2 的列表中获取值

lisp - 如何在 Windows 下使用 MSVC2010 构建 ecl.dll 的静态库?

lisp - 为什么 TIME 报告的字节数因调用而异?

lisp - 删除 Common Lisp 中的类型

functional-programming - Funcall 在 Common Lisp 中如何工作?

kotlin - 参加 Kotlin 的序列

lisp - 在 Scheme 中创建斐波那契数列?

lisp - 您将 Scheme 宏用于哪些方面?

groovy - 我需要 Groovy 中特定长度的子序列

python - 具有重复连续数字的范围