为什么
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])
答案 0 :(得分:1)
这是来自map
的正确行为。
print
命令返回NULL
。
foo := print(1);
1
foo :=
lprint(foo);
NULL
应用于列表的map
命令将始终返回列表。 map
的返回值不是传递给map
的第一个参数(运算符)的任何调用的返回值。
让我们再举一个例子,另一个程序返回NULL
。
f := proc(x) NULL; end proc:
map(f, [1,2,3]);
[]
因此原始列表[1,2,3]
的每个条目都被NULL
替换,这会导致三个NULL
s的表达式序列,最终为NULL
。因此,在此处应用map
的最终结果是[NULL]
,它会生成空列表[]
。
bar := NULL, NULL, NULL;
bar :=
lprint(bar);
NULL
[ NULL, NULL, NULL ];
[]
如果您不希望在示例中看到从map
返回的空列表,则使用完整冒号终止该语句。
如果您使用seq
而不是map
来执行此操作,则返回值将为正NULL
(因为它生成三个NULL
的表达式序列,如上所示变为NULL
)。
seq(print(x), x=[1,2,3]);
1
2
3
lprint(%);
NULL