为什么 map on list 会产生额外的 []

why map on list generates extra []

为什么

 map(x->print(x),[1,2,3]);

生成

                           1
                           2
                           3
                           []

[] 是从哪里来的?根据帮助,.

 The map commands apply fcn to the operands or elements of expr.

  op([1,2,3]);

给予

  1, 2, 3

但这里似乎 fcn 也应用于列表本身,即 op(0,[1,2,3])

这是 map 的正确行为。

print命令returns NULL.

foo := print(1);
                      1

                    foo :=

lprint(foo);
  NULL

应用于列表的map命令将始终return一个列表。 map 的 return 值不是对传递给 map.

的第一个参数(运算符)的任何调用的 return 值

让我们再举一个例子,用另一个程序 returns NULL

f := proc(x) NULL; end proc:

map(f, [1,2,3]);
                      []

所以原始列表 [1,2,3] 的每个条目都被 NULL 替换,这导致三个 NULL 的表达式序列,最终成为 NULL .因此,在此处应用 map 的最终结果是 [NULL],它会生成空列表 [].

bar := NULL, NULL, NULL;
                    bar :=

lprint(bar);            
  NULL

[ NULL, NULL, NULL ];
                      []

如果您不想在您的示例中看到从 map 编辑的空列表 return,则以完整的冒号结束该语句。

如果您使用 seq 而不是 map 来执行此操作,那么 return 值将只是 NULL (因为它会产生三个 NULLs,如上所示变为 NULL).

seq(print(x), x=[1,2,3]);
                                           1

                                           2

                                           3

lprint(%);               
  NULL