# 3.6.1 Making procedures

Scheme provides a general mechanism for making a procedure:

Expression ::$\Rightarrow$ ProcedureExpression
ProcedureExpression ::$\Rightarrow$ (lambda (Parameters) Expression)
Parameters ::$\Rightarrow$ $\epsilon$ | Name Parameters

Evaluating a ProcedureExpression produces a procedure that takes as inputs the Parameters following the lambda. The lambda special form means “make a procedure”. The body of the resulting procedure is the Expression, which is not evaluated until the procedure is applied.

A ProcedureExpression can replace an Expression. This means anywhere an Expression is used we can create a new procedure. This is very powerful since it means we can use procedures as inputs to other procedures and create procedures that return new procedures as their output!

Here are some example procedures:

1.  (lambda (x) (* x x))
Procedure that takes one input, and produces the square of the input value as its output.

2.  (lambda (a b) (+ a b))
Procedure that takes two inputs, and produces the sum of the input values as its output.

3.  (lambda () 0)
Procedure that takes no inputs, and produces 0 as its output. The result of applying this procedure to any argument is always 0.

4.  (lambda (a) (lambda (b) (+ a b)))
Procedure that takes one input (|a|), and produces as its output a procedure that takes one input and produces the sum of |a| and that input as its output. This is an example of a higher-order procedure. Higher-order procedures produce procedures as their output or take procedures as their arguments. This can be confusing, but is also very powerful.