Sì, ci sono tali lingue. Molti di loro.
In effetti, questa funzione è praticamente la definizione di un linguaggio di array o linguaggio vettoriale . Esempi di linguaggi array e vettoriali includono, ma non sono limitati a, la famiglia di linguaggi APL con i suoi successori, derivati e cugini (ad esempio APL, J, K) e praticamente tutti i linguaggi matematici e statistici come Mathematica, MATLAB, Octave, R e S.
Anche Fortran 90 e Ada hanno questa caratteristica, così come Fortress.
È interessante notare che molte CPU moderne supportano anche la programmazione vettoriale, ad es. l'architettura x86 con MMX, SSE, SSE2, SSE3 (Intel) e 3DNow! (AMD) set di istruzioni, le architetture POWER e PowerPC con i set di istruzioni VMX e AltiVec, Sparc, MIPS, anche ARM.
La Cω lingua di Microsoft Research ha il concetto di stream (più o meno simile a IEnumerable
). Gli stream funzionano praticamente esattamente come tu descrivi. Ecco un esempio della documentazione di Cω (enfasi mia):
A key programming feature of Cω is generalized member access: the familiar 'dot' operator is now much more powerful. Thus if the receiver is a stream, then the member access is mapped over the elements, e.g. zones.ToString()
implicitly maps the method call over the elements of the stream zones
and returns a value of type string*
. This feature significantly reduces the burden on the programmer.
Una proprietà molto interessante di questo tipo di programmazione è che non solo consente di pensare semanticamente di "applicare un'operazione a tutti gli elementi contemporaneamente", ma consente anche all'implementatore della lingua di implementalo con letteralmente applicando un'operazione a tutti gli elementi in una volta , IOW in parallelo .