Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp Mapcan';s在原子上的行为_Common Lisp_Map Function - Fatal编程技术网

Common lisp Mapcan';s在原子上的行为

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”。(本例可能没有实际需要;我只

我对CommonLisp几乎是个新手,只是为了好玩才使用它。但是我想知道mapper和mapcan之间的区别,因为hyperspec和其他地方的文档非常清楚

但是,如果函数mapcan对list元素的调用的计算结果是atom而不是list,会发生什么呢?由于mapcan使用nconc附加列表,我原以为如果没有列表,就会出现错误

但是如果我尝试

(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发出错误信号。