[66] definition = *variable-definition*
| *procedure-definition*

Definitions may take two possible forms.

[67] variable-definition = (define *variable* *expression*)

[68] procedure-definition = (define
(*variable* *formal-argument-list*)
*body*)

(define *variable*

(lambda (*variable* *formal-argument-list*) *body*)).

(lambda (

(define *variable* *expression*)

(define add3

(lambda (x) (+ x 3)))

(add3 3) 6

(define first car)

(first '(1 2)) 1

(lambda (x) (+ x 3)))

(add3 3) 6

(define first car)

(first '(1 2)) 1

NOTE 9 |

This constraint does not prevent the definition of mutually recursive procedures, because evaluating a lambda expression does not reference variables that occur free within it. |

NOTE 10 |

This rule is not easy to implement, but it allows built-in procedures to be added in future versions of this International Standard without changing the meaning of any conforming DSSSL specifications. |

[69] body = *definition** *expression*

(let ((x 5))

(define foo (lambda (y) (bar x y)))

(define bar (lambda (a b) (+ (* a b) a)))

(foo (+ x 3))) 45

(define foo (lambda (y) (bar x y)))

(define bar (lambda (a b) (+ (* a b) a)))

(foo (+ x 3))) 45

(let ((x 5))

(letrec ((foo (lambda (y) (bar x y)))

(bar (lambda (a b) (+ (* a b) a))))

(foo (+ x 3))))

(letrec ((foo (lambda (y) (bar x y)))

(bar (lambda (a b) (+ (* a b) a))))

(foo (+ x 3))))