Common lisp Mapcan';s在原子上的行为
我对CommonLisp几乎是个新手,只是为了好玩才使用它。但是我想知道mapper和mapcan之间的区别,因为hyperspec和其他地方的文档非常清楚 但是,如果函数mapcan对list元素的调用的计算结果是atom而不是list,会发生什么呢?由于mapcan使用nconc附加列表,我原以为如果没有列表,就会出现错误 但是如果我尝试Common lisp Mapcan';s在原子上的行为,common-lisp,map-function,Common Lisp,Map Function,我对CommonLisp几乎是个新手,只是为了好玩才使用它。但是我想知道mapper和mapcan之间的区别,因为hyperspec和其他地方的文档非常清楚 但是,如果函数mapcan对list元素的调用的计算结果是atom而不是list,会发生什么呢?由于mapcan使用nconc附加列表,我原以为如果没有列表,就会出现错误 但是如果我尝试 (mapcan (lambda (x) (+ 2 x)) '(1 2 3 4)) sbcl和clisp中的计算结果为“6”。(本例可能没有实际需要;我只
(mapcan (lambda (x) (+ 2 x)) '(1 2 3 4))
sbcl和clisp中的计算结果为“6”。(本例可能没有实际需要;我只是好奇)我看到了返回值可能比简单错误更好的一点,但是如果没有列表,可以找到关于mapcan返回最后一个值的任何信息
这种行为有什么原因吗?根据(mapcan(lambda(x)(+2 x))”(1 2 3 4))
应该和(apply#'ncoc(mapcar(lambda(x)(+2 x))(1 2 3 4))
做同样的事情,并且它发出错误信号***-ncoc:5不是clisp中的列表
hyperspec仅显示NCOC
应使用正确的列表和nil
作为上一个参数执行的操作。它没有任何其他描述,因此您看到的是sbcl
和clisp
可能在公共域中共享lisp中的算法,或者它们实现了非常相似的算法,它们具有相同的实现特定结果
您可能无法假设其他实现也会这样做,因此您应该确保传递给mapcan
的函数始终返回一个新列表或nil
,该列表可以ncoc
-ed在其中。LispWorks和GCL发出错误信号。