почему карта в списке генерирует дополнительные [] - PullRequest
0 голосов
/ 01 июня 2018

Почему

 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])

1 Ответ

0 голосов
/ 01 июня 2018

Это правильное поведение из 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
...