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 circle is a (make-circle posn number) (define-struct circle (center radius))
would yield the template
(define (circ-func acirc) (circle-center acirc) ... (circle-radius acirc) ... )
For a structure, we simply pull out all of the pieces inside of the template.
; A circle is a (make-circle posn number) (define-struct circle (center radius)) ; 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) ... (circle-radius 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 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)) ...]))