Next: scheme overview syntax, Previous: scheme overview forms, Up: scheme overview [Index]
Definitions can also be used to define procedures:
(define (f x) (+ x 42)) (f 23) ⇒ 65
A procedure is, slightly simplified, an abstraction of an expression
over objects. In the example, the first definition defines a procedure
called f
. (Note the parentheses around f x
, which
indicate that this is a procedure definition.) The expression (f
23)
is a procedure call, meaning, roughly, “evaluate (+ x 42)
(the body of the procedure) with ‘x’ bound to ‘23’”.
As procedures are objects, they can be passed to other procedures:
(define (f x) (+ x 42)) (define (g p x) (p x)) (g f 23) ⇒ 65
In this example, the body of g
is evaluated with p bound to
f
and ‘x’ bound to ‘23’, which is equivalent to
(f 23)
, which evaluates to ‘65’.
In fact, many predefined operations of Scheme are provided not by
syntax, but by variables whose values are procedures. The +
operation, for example, which receives special syntactic treatment in
many other languages, is just a regular identifier in Scheme, bound to a
procedure that adds number objects. The same holds for *
and
many others:
(define (h op x y) (op x y)) (h + 23 42) ⇒ 65 (h * 23 42) ⇒ 966
Procedure definitions are not the only way to create procedures. A
lambda
expression creates a new procedure as an object, with no
need to specify a name:
((lambda (x) (+ x 42)) 23) ⇒ 65
The entire expression in this example is a procedure call; (lambda
(x) (+ x 42))
, evaluates to a procedure that takes a single number
object and adds 42 to it.
Next: scheme overview syntax, Previous: scheme overview forms, Up: scheme overview [Index]