A variant of named-let of Scheme language, which supports following special features;
NO-RETURNGLOBAL-EXIT-FROM-LOCAL-FUNCTION
LOCAL-FUNCTION enables to describe and execute recuresive local function
which is similar to the named-let in Scheme language.
LOCAL-FUNCTION supports NO-RETURN function call feature, which will be translated into a GO expression.
NO-RETUREN can be located anywhere upon local-function body.
NOTE: just on this implementation, NO-RETURN not supported to call other functions.
NOTE: TCO for non NO-RETURN style recursive call is not guaranteed.
LOCAL-FUNCTION also supports GLOBAL-EXIT-FROM-LOCAL-FUNCTION, similar to RETURN, for global exit from a local function.
(defun fx (x)
(declare (integer x))
(local-function f ((i x)) (sum 0)
(declare (integer i sum))
(when (> i 0)
(no-return (f (the integer (1- i)) (the integer (+ sum i)))) )
(format t \"~&SUM is ~a~%\" sum)
(global-exit-from-local-function sum) )) ; or, just sum
will be expanded to
(defun fx (x)
(declare (integer x))
(block #1=#:G1
(labels
((f (#3=#:G3 #4=#:G4)
(declare (integer #3# #4#))
(tagbody #2=#:G2
(let ((i #3#) (sum #4#))
(declare (integer i sum))
(return-from f
(progn
(if (> i 0)
(progn
(psetq i (the integer (1- i))
sum (the integer (+ sum i)))
(go #2#) ))
(format t \"~&SUM is ~a~%\" sum)
(return-from #1# sum) )))))) ; or, just sum
(f x 0) )))
and enable to execute pseudo recursive call deeper than deeper.
> (fx 100000000)
SUM is 5000000050000000
5000000050000000
>
Under MIT license.