ForEach loop in Mathematica

Me gustaría algo como esto:

each[i_, {1,2,3},
  Print[i]
]

O, de manera más general, para destruir cosas arbitrarias en la lista por la que está pasando, como:

each[{i_, j_}, {{1,10}, {2,20}, {3,30}},
  Print[i*j]
]

Por lo general, usted desea usar Map u otras construcciones puramente funcionales y evitar un estilo de programación no funcional en el que usa efectos secundarios. Pero aquí hay un ejemplo en el que creo que una construcción para cada uno es sumamente útil:

Digamos que tengo una lista de opciones (reglas) que emparejan símbolos con expresiones, como

attrVals = {a -> 7, b -> 8, c -> 9}

Ahora quiero hacer una tabla hash en la que haga la asignación obvia de esos símbolos a esos números. No creo que haya una forma más limpia de hacerlo que

each[a_ -> v_, attrVals, h[a] = v]
Casos de prueba adicionales

En este ejemplo, transformamos una lista de variables:

a = 1;
b = 2;
c = 3;
each[i_, {a,b,c}, i = f[i]]

Después de lo anterior, {a, b, c} debe evaluar a {f [1], f [2], f [3]}. Tenga en cuenta que eso significa que el segundo argumento de "cada uno" debe mantenerse sin evaluar si se trata de una lista.

Si la forma no evaluada no es una lista, debe evaluar el segundo argumento. Por ejemplo:

each[i_, Rest[{a,b,c}], Print[i]]

Eso debería imprimir los valores de b y c.

Apéndice: Para hacer correctamente cada uno, debe admitir Break [] y Continue []. No estoy seguro de cómo implementar eso. Tal vez deba implementarse de alguna manera en términos de For, While o Do, ya que esas son las únicas construcciones de bucle que admiten Break [] y Continue [].

Y otro problema con las respuestas hasta ahora: comen Return [] s. Es decir, si está utilizando un bucle ForEach en una función y desea regresar de la función desde dentro del bucle, no puede hacerlo. Emisión de retorno dentro del bucle ForEach parece funcionar como Continuar []. Esto solo (esperalo) me lanzó para un bucle.

Respuestas a la pregunta(7)

Su respuesta a la pregunta