Я хотел бы что-то вроде этого:
each[i_, {1,2,3},
Print[i]
]
Или, в более общем смысле, для деструктурирования произвольных элементов в списке, над которым вы работаете, например:
each[{i_, j_}, {{1,10}, {2,20}, {3,30}},
Print[i*j]
]
Обычно вы хотите использовать Map
или другие чисто функциональные конструкции и избегать нефункционального стиля программирования, где вы используете побочные эффекты. Но вот пример, где я думаю, что конструкция для каждого чрезвычайно полезна:
Скажем, у меня есть список опций (правил), которые связывают символы с выражениями, как
attrVals = {a -> 7, b -> 8, c -> 9}
Теперь я хочу создать хеш-таблицу, в которой я делаю очевидное сопоставление этих символов с этими числами. Я не думаю, что есть более чистый способ сделать это, чем
each[a_ -> v_, attrVals, h[a] = v]
Дополнительные тестовые случаи
В этом примере мы преобразуем список переменных:
a = 1;
b = 2;
c = 3;
each[i_, {a,b,c}, i = f[i]]
После вышесказанного {a,b,c}
следует оценить как {f[1],f[2],f[3]}
. Обратите внимание, что это означает, что второй аргумент для each
должен оставаться неоцененным, если это список.
Если неоцененная форма не является списком, она должна оценить второй аргумент. Например:
each[i_, Rest[{a,b,c}], Print[i]]
Это должно вывести значения b
и c
.
Приложение: Для правильной работы каждого из них он должен поддерживать Break[]
и Continue[]
. Я не уверен, как это реализовать. Возможно, его нужно будет каким-то образом реализовать в терминах For, While или Do, поскольку это единственные конструкции цикла, которые поддерживают Break[]
и Continue[]
.
И еще одна проблема с ответами: они едят Return[]
s. То есть, если вы используете цикл ForEach в функции и хотите вернуться из функции внутри цикла, вы не сможете. Возврат Return внутри цикла ForEach, похоже, работает как Continue[]
. Это просто (подожди) бросило меня в тупик.