由于这是您的第一个 Scheme 程序,您可能只需要引入一个条件表达式 ,cond
以避免在到达末尾时进一步递归。例如:
; sum : natural -> natural
; compute the sum 0+1+...+max
(define (sum max)
(define (sum-helper i sum-so-far)
(if (> i max)
sum-so-far
(sum-helper (+ i 1) (+ sum-so-far i))))
(sum-helper 0 0))
(display (sum 10))
(newline)
但是,如果您需要return
像在 C 中一样返回传统longjmp
,则需要存储和使用转义延续。这可以这样做:
(define (example)
(let/ec return
(define (loop n)
(if (= n 100000)
(return (list "final count: " n))
(loop (+ n 1))))
(loop 0)))
(display (example))
如果let/ec
未在您的 Scheme 实现中定义,则在您的程序前加上:
(define-syntax let/ec
(syntax-rules ()
[(_ return body ...)
(call-with-current-continuation
(lambda (return)
body ...))]))
更新:
请注意,cond
有一个=>
变体:
(cond
[(call-that-can-fail)
=> (lambda (a) <use-a-here>))]
[else <do-something-else>])
如果调用成功,则采用第一个子句并将结果绑定到 a。如果调用失败,则使用 else 子句。