map-each
можно использовать для оценки некоторого кода для каждого члена в коллекции и агрегирования результатов оценки в блоке:
>> values: map-each x [1 2] [
print ["Doing mapping for" x]
x * 10
]
Doing mapping for 1
Doing mapping for 2
== [10 20]
Таким образом я строил блок из блоков. Но я забыл, что, поскольку блоки не оцениваются по умолчанию, x
останется как есть и не получит желаемое значение:
>> blocks: map-each x [1 2] [
print ["Doing mapping for" x]
[x * 10]
]
Doing mapping for 1
Doing mapping for 2
== [[x * 10] [x * 10]]
В этом нет ничего удивительного. После оценки x
не имеет значения - не говоря уже о возможности принимать многие значения:
>> probe x
** Script error: x has no value
Так что уже слишком поздно, оценка должна выполняться с помощью REDUCE или COMPOSE внутри тела карты-each. Но...
>> reduce first blocks
== [20]
>> reduce second blocks
== [20]
Оценки элементов в блоке результатов не вызывают ошибки, а ведут себя так, как если бы x
имел значение последней итерации.
Как он это делает? Должен ли он делать это?