查看邻接文档中的HyperSpec,我在示例部分看到了以下内容:
(setq slist '()) => NIL
(setq slist (adjoin '(test-item 1) slist)) => ((TEST-ITEM 1))
(adjoin '(new-test-item 1) slist :key #'cadr) => ((TEST-ITEM 1))相反,我本以为会有以下情况:
(adjoin '(new-test-item 1) slist :key #'cadr) => ((NEW-TEST-ITEM 1) (TEST-ITEM 1))我的期望是由于HyperSpec (17.2.1)中的下列文本
当下一个图中列出的运算符F对序列S的每一个元素Ei迭代地考虑对象O时,控制F测试S中O的存在的方式有时是有用的。这种控制是根据指定的函数提供的,指定为:test或:test--而不是参数。
此外,还:
对象O不能与Ei直接比较。如果提供了a :key参数,则它是一个函数的指示符,该函数将以每个Ei作为参数调用一个参数,并生成一个用于比较的对象Zi。(如果没有:关键论点,子就是爱。) 由:key参数指定的函数从未调用过O本身。但是,如果该函数在多个序列上操作(例如,在set-difference中发生的情况),则O将是对另一个序列的元素调用:key函数的结果。
因此,我们有slist (序列,S)为'((TEST-ITEM 1)),O为'(new-test-item 1)。为了检查是否应该附加O,函数#'cadr应用于S的元素,第一个是'(test-item 1)。所以,这个测试给出了:
(cadr '(test-item 1)) => 1现在,当O,'(new-test-item 1)与将#'cadr应用到#'eql的S的E1 (当没有提供:test时使用的相等函数)的结果进行检查时,false结果应该意味着O是相邻的。至少我是这么想的。我误会什么了?
发布于 2014-03-12 18:20:40
这是HyperSpec中的一个bug,相邻发行.规范已经在CLiki上写过了。有关部分如下:
问题描述: CLHS通过引用满足双参数测试的17.2.1节指定在存在:KEY参数的情况下的相邻行为。这是不正确的,因为第17.2.1节指定不能在ITEM参数上调用key函数,但是像在pushnew中所指定的那样,相邻函数会调用。提案(相邻:澄清): 取代: 测试、测试-否和键将影响如何确定项是否与列表中的元素相同。有关详细信息,请参阅第17.2.1节(满足双参数测试)。出自: 项是否已经是列表的成员是通过使用:test或:test-not进行比较来确定的。测试或:test-not函数的第一个参数是应用于该项的:key函数(如果提供的话)返回的结果;第二个参数是由:key函数(如果提供的话)返回的列表元素。如果:key被提供,它将用于从item和list元素中提取要测试的部件。理由: 对邻接规范的澄清。 现行做法: 所有的实现都是按照在pushnew上指定的方式实现的,而不是按照在adjoin上指定的那样实现的。
https://stackoverflow.com/questions/22359337
复制相似问题