# Functions¶

The heart of functional programming is, of course, the function. Here’s a brief review of what a function is.

## Functions as “Black Boxes”¶

You can think of a function as a “black box” that takes some input or inputs and provides some output. Here’s a picture of a black box that adds whatever two numbers come into its input hopper:

If you were to write this in a pseudo-mathematical notation, you could write something like this:

Here’s another black box that finds the average of its inputs:

In mathematics-like notation, average(8, 5) → 6.5

## Functions in Functions¶

If you were to take an X-ray of the average box, you would find that it contains two function boxes inside it:

In our pseudo-mathematical notation, using generic variable names instead of 8 and 5, you could write this: average(a, b) ⇒ divide(add(a, b), 2).

Before leaving this subject, it’s worth noting that the add, divide and average functions are all pure functions; if you give them the same input, you will always, always get the same output. Keeping your functions as pure as possible is a Good Thing™. Yes, there are non-pure functions, and you will see them in upcoming chapters.

Next Section - Functions in ClojureScript