如果您尝试在 的一侧执行多个带有副作用的操作if
,那么您需要将它们放入 中begin
,如下所示:
(if (char=? (string-ref str loc) #\a)
(begin (set! count (+ count 1))
(set! reference (+ reference 1)))
~else action, etc.~
如果您不想改变变量,而是想一次返回两个值,那么您需要将表达式组合成一个对象,如下所示:
(if (char=? (string-ref str loc) #\a)
(cons (+ count 1) (+ reference 1)))
~else expression~
在这种情况下,要提取计数和引用,您需要将car
andcdr
应用于if
- 或者您实际上可以返回多个值,如下所示:
(if (char=? (string-ref str loc) #\a)
(values (+ count 1) (+ reference 1)))
~else expression~
在这种情况下,要提取计数和引用,您需要在调用if
. 一种方法是使用let-values
,可能是这样的:
(define count&ref
(λ (str ch)
(let loop ([loc 0] [count 0] [reference 0])
; whatever other stuff you're doing
(if (char=? (string-ref str loc) ch)
(values (+ count 1) (+ reference 1)))
~else expression~ )))
(let-values ([(new-count new-ref) (count&ref "some stuff" #\u)])
;in here, new-count and new-ref are bound to whatever count&ref returned
)
另一方面,如果count
和reference
是您在循环中跟踪的变量,最简单的方法可能是在 中调用循环的下一次迭代if
,如下所示:
(let loop ([loc 0] [count 0] [reference 0])
; whatever other stuff you're doing
(if (char=? (string-ref str loc) #\a)
(loop (+ loc 1) (+ count 1) (+ reference 1))
~else expression~ ))