多値

これまた今までの文化に無いので、メリットが実感できない概念。
理解すんのは難しくなさそうだけどね。

多値を受け取る方法1

(receive (名前1 名前2 名前3 ... 名前n)
         多値を返すS式
         receive式の値となるS式)

ってな具合。帰ってきた多値が名前1、名前2、...、名前nを束縛する。

(receive (名前1 . 名前2)
         多値を返すS式
         receive式の値となるS式)

ってすれば多値の先頭の値が名前1を束縛して、残りがリストとしてまとめて名前2を束縛する。

(receive 名前
         多値を返すS式
         receive式の値となるS式)

ってすると、多値全部がリストにまとめられて名前を束縛する。


使ってみると

gosh> (receive (min max)
           (min&max 0 1 5 3)
         (print "min=" min " max=" max))
min=0 max=5
#<undef>
gosh> (receive (min . others)
           (min&max 0 1 5 3)
         (print "min=" min " others=" others))
min=0 others=(5)
#<undef>
gosh> (receive vals
           (min&max 0 1 5 3)
         (print "vals=" vals))
vals=(0 5)
#<undef>

うむ。

多値を受け取る方法2

let-valuesって構文を使うと、

(let-values (((a1 a2 ... an) 多値を返すS式)
             ((b1 b2 ... bn) 多値を返すS式)
             ...
             ((x1 x2 ... xn) 多値を返すS式))
            let-valuesの値となるS式)

ってできるらしい。
letとlet*みたいに、let-valuesに対してlet*-valuesがあるそうだが、割愛。
それにしても、なぜlet-values*じゃなくてlet*-valuesなのか。
let-keywordsのときはlet-keywords*だったのにっ!


使ってみた。

gosh> 
(let-vlaues (((a b) (min&max 1 2))
             ((c d) (min&max 3 4)))
   (print "a=" a " b=" b)
   (print "c=" c " d=" d))
*** ERROR: unbound variable: c
Stack Trace:
_______________________________________
  0  (c d)
        At line 19 of "(stdin)"
  1  (c d)
        At line 19 of "(stdin)"
  2  ((a b) (min&max 1 2))
        At line 18 of "(stdin)"

(゚Д゚)ハァ?

多値を受け取る方法3

買えされた多値のうちどれか1つしか必要ない場合はvalues-refなるものが使える。

(values-ref 多値を返すS式 取得したい値のインデックス)

インデックスは0開始(明記されてはいないっぽいけど、文脈から判断)で、C系言語の配列と同じ感覚で使えそう。

多値を返す方法

(values 値1 値2 ... 値n)

だけ。これは簡単だ。


使ってみた。

gosh> (values 1 2 3)
1
2
3

うむ。