多値
これまた今までの文化に無いので、メリットが実感できない概念。
理解すんのは難しくなさそうだけどね。
多値を受け取る方法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
うむ。