Next: srfi rec ack, Previous: srfi rec rationale, Up: srfi rec [Index]
The following production rules are to be added to those of [KCR1998] (we reuse names of non–terminals).
<derived expression> --> <rec expression> <rec expression> --> (rec <variable> <expression>) <rec expression> --> (rec (<variable>+) <body>)
Scheme versions such as [KCR1998] providing define-syntax
,
syntax-rules
, letrec
and lambda
might implement
rec
as follows.
(define-syntax rec (syntax-rules () [(rec (NAME . VARIABLES) . BODY) (letrec ( (NAME (lambda VARIABLES . BODY)) ) NAME)] [(rec NAME EXPRESSION) (letrec ( (NAME EXPRESSION) ) NAME)]))
The following session shows in which way rec
allows a
tail–recursive implementation of the factorial function.
> (define F (rec (F N) ((rec (G K L) (if (zero? K) L (G (- K 1) (* K L)))) N 1))) > F #<procedure> > (F 0) 1 > (F 10) 3628800