きくらげ観察日記

好きなことを、適当に。

Gaucheで多値を受け取る

複数の値を返す場合、それらの値をリストやペアにしてもよいのですが、通常、Schemeでは多値というものを利用します。

gosh> (min&max 2 4 3 1 5)
1
5

このmin&maxは、与えられた引数のうち最小値と最大値を返す多値関数です。

他にも、商と余りを返すquotient&remainder等もあります。

gosh> (quotient&remainder 5 2)
2
1

多値を生成するには、values関数を使います。

(define (upcase&downcase c)
  (values (char-upcase c) (char-downcase c)))

(upcase&downcase #\a) ; => #\A #\a
(upcase&downcase #\B) ; => #\B #\b

多値を受け取るには、srfi-11のlet-valuesやlet*-valuesを使います。

(let-values (((min max) (min&max 2 4 3 1 5)))
  (print #"minimum is ~min")
  (print #"maximum is ~max"))
;; =>
;; minimum is 1
;; maximum is 5