# CS 1102: Accelerated Intro to Program Design Examples of Templates

Templates arise from data definitions. It's meaningless to talk about a template without a data definition. The idea of a template is to write a skeleton of a function that consumes a particular kind of data as input. The template captures everything we know about the structure of the program based on the structure of the data.

### A Template for Structs

```; A circle is a (make-circle posn number)

```

would yield the template

```(define (circ-func acirc)
(circle-center acirc) ...
```

For a structure, we simply pull out all of the pieces inside of the template.

### A Template for Collections of Structs

```; A circle is a (make-circle posn number)

; A square is a (make-square posn number)
(define-struct square (top-left width))

; A shape is either
;  - a circle, or
;  - a square
```

Here, the template for shape has two cases (one for each option in the definition). In each case, we call the template for the corresponding shape.

```(define (circ-func acirc)
(circle-center acirc) ...

(define (square-func asqr)
(square-top-left asqr) ...
(square-width asqr) ...)

(define (shape-func ashape)
(cond [(circle? ashape) (circ-func ashape)]
[(square? ashape) (square-func ashape)]))
```

### A Template for Lists

```; A list-of-symbols is
;  - empty, or
;  - (cons symbol list-of-symbols)
```

Now, the template breaks down the list inside the cons? case and includes a recursive call to capture the "arrow" from list-of-symbols back to itself.

```(define (list-of-sym-func alos)
(cond [(empty? alos) ...]
[(cons? alos)
... (first alos)
... (list-of-sym-func (rest alos)) ...]))
```