## Scheme's special map

As mentioned in the previous article, the map function does the following:

```
map f(x) [1, 2, 3, 4, 5]
-> [f(1), f(2), f(3), f(4), f(5)]
```

The Scheme family of languages provide a more advanced map function which allows the following:

```
map f(x, y) [1, 2, 3, 4] [a, b, c, d]
-> [f(1, a), f(2, b), f(3, c), f(4, d)]
```

This version of map can take multiple lists, and a function with as many arguments as there are lists, and apply over every list at once to return a single list of answers. The only requirement is that all given lists must be the same length.

For more examples:

```
(define (zip lst1 lst2)
(map list lst1 lst2))
(define (add-index lst)
(map cons (range (length lst)) lst))
(define (square-list lst)
(map * lst lst))
```