の 1 つのアームで副作用のある複数のアクションを実行しようとしている場合は、次のようif
にそれらを に配置する必要があります。begin
(if (char=? (string-ref str loc) #\a)
(begin (set! count (+ count 1))
(set! reference (+ reference 1)))
~else action, etc.~
変数を変更する代わりに、一度に 2 つの値を返したい場合は、次のように式を 1 つのオブジェクトに結合する必要があります。
(if (char=? (string-ref str loc) #\a)
(cons (+ count 1) (+ reference 1)))
~else expression~
この場合、カウントと参照を引き出すには、適用する必要があります。car
また、次cdr
のように、if
実際には複数の値を返すこともできます。
(if (char=? (string-ref str loc) #\a)
(values (+ count 1) (+ reference 1)))
~else expression~
その場合、カウントと参照を引き出すには、if
. これを行う 1 つの方法は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~ ))