* * * * *

                          More fun with static types

What else can you do with typing systems [1]? And what about that relentless
drive towards multiple processor machines [2]?

One thing, better parallelization of code. One such method is the map
function [3], where some function (or code) is applied to every element in a
list, and each such application is independent of each other. In the current
crop of langauges, there's an actual function or keyword that is used:

> (DEFINE INCR (LAMBDA (X) (+ X 1)))
> (MAPCAR #'INCR '(1 2 3 4 5))
>

This bit of Lisp code increments the elements of a list by 1. Other languages
have a similar function or library variation on map. But why? Couldn't we
have the compiler figure it out? At least in a few instances?

For instance, in C, the following will give a compiler error:

> {
>   double x[100];
>   double y[100];
>
>   y = sin(x);
> }
>

since sin() takes a single double parameter, not an array. But since I'm
talking hypothetical compilers here, couldn't the compiler recognize that x
is an array of doubles, and that sin() takes a single double, and since the
result is going to another array of doubles, why not just map sin() over the
array x? On a uniprocessor machine the code generated could be something
like:

> {
>   double x[100];
>   double y[100];
>   size_t i;
>
>   for (i = 0 ; i < 100 ; i++)
>     y[i] = sin(x[i]);
> }
>

Given a routine that expects a parameter of type X, and a variable array of
type X, passing said variable array into said routine should not produce an
error, but a mapping instead. No fence post errors [4]. No having to type out
for loops, or while loops, or loops of any kind. Or even of having to type
out “map.”

Or is this too much DWIM (Do What I Mean)?

[1] gopher://gopher.conman.org/0Phlog:2007/02/21.2
[2] gopher://gopher.conman.org/0Phlog:2005/02/18.1
[3] http://en.wikipedia.org/wiki/Map_(higher-order_function)
[4] http://c2.com/cgi/wiki?FencePostError

Email author at [email protected]