# lispy.el demo 2: the substitution model for procedure application

## Intro

Understand how this code works:

```(defun triangle-using-cond (number)
(cond ((<= number 0) 0)
((= number 1) 1)
((> number 1)
(+ number (triangle-using-cond (1- number))))))
```

I'll use The Substitution Model for Procedure Application from SICP.

## Screencast

The screencast for this demo is here: https://www.youtube.com/watch?v=D7mK2q3yve4

## Step-by-step expansion

### step 1

```(defun triangle-using-cond (number)
(cond ((<= number 0) 0)
((= number 1) 1)
((> number 1)
(+ number (triangle-using-cond (1- number))))))
(triangle-using-cond 4)
```

Eval the defun with e. Then do je to eval the next expression to get `10`.

### step 2

Press xfM to get:

```(cond ((<= 4 0)
0)
((= 4 1)
1)
((> 4 1)
(+ 4 (triangle-using-cond (1- 4)))))
```

With e check that the result is still `10`.

### step 3

Evaluate the `cond` branches in your mind and simplify with qhrr.

```(+ 4 (triangle-using-cond (1- 4)))
```

Then ffxr.

```(+ 4 (triangle-using-cond 3))
```

### step 4

Press xfM again:

```(+ 4 (cond ((<= 3 0)
0)
((= 3 1)
1)
((> 3 1)
(+ 3 (triangle-using-cond (1- 3))))))
```

Evaluate the `cond` branches in your mind and simplify with qirr.

```(+ 4 (+ 3 (triangle-using-cond (1- 3))))
```

Simplify further with ffxr.

```(+ 4 (+ 3 (triangle-using-cond 2)))
```

### step 5

Press xfM again:

```(+ 4 (+ 3 (cond ((<= 2 0)
0)
((= 2 1)
1)
((> 2 1)
(+ 2 (triangle-using-cond (1- 2)))))))
```

Evaluate the `cond` branches in your mind and simplify with qjrr.

```(+ 4 (+ 3 (+ 2 (triangle-using-cond (1- 2)))))
```

Simplify further with ffxr.

```(+ 4 (+ 3 (+ 2 (triangle-using-cond 1))))
```

### step 6

Press xfM again:

```(+ 4 (+ 3 (+ 2 (cond ((<= 1 0)
0)
((= 1 1)
1)
((> 1 1)
(+ 1 (triangle-using-cond (1- 1))))))))
```

Evaluate the `cond` branches in your mind and simplify with akrr.

```(+ 4 (+ 3 (+ 2 1)))
```

C-e e to check that the result is still `10`. That's it.