Это правильное поведение из 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
с, что в итоге составляет 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