Lua の多値は、Common Lisp の多値に近い
2008/08/03
Common Lispでは、values を使うと多値を返すことができます。多値というものはCommon Lispで始めて知りました。多値を返すのは簡単ですが、多値を受け取る時にちょっと面倒です。
(defun get-multiple-values () (values 1 "second value")) ;多値をリストに変換して受け取る場合((リスト以外にも受け取る方法はあります)) (setf a (multiple-value-list (get-multiple-values))) ; ==> a には (1 "second value") というリストが代入される。 ;多値の2番目を捨てて、最初の値だけを受け取る場合 (setf b (get-multiple-values)) ; ==> b には 1 が代入される。
扱いは多少面倒ですが、普通に受け取ると2番目以降の値が捨てられるので、今まで戻り値に多値を使用していなかった関数の戻り値の追加とか、ちょっとした拡張を多値を使わなかった時の動作に影響なく行なうことができたり便利な機能です。
多値と配列が区別がつかないのが影響している様なので、いずれは区別がつくような仕様になってもらいたいなぁ。と思ったですね。
このエントリを書こうと思ったのは、ytakenakaさんが、rubyで多値風なことをやっていたからです。
rubyでは、return 1, “second value” とした時は配列を返すそうです。仕様としては想像しやすい動作なのかもしれません。perlも多値風のことをやるとしたら、リストで代用するしかないと思います。(追記:ytakenakaさんにコメント頂いて試してみました。pythonもrubyと同じ動作をしました。)
今勉強中のLuaでは、もっと本物の(笑)多値に近いものを持ってますよ。
function getmultiplevalues() return 1, 'second value' end a1, a2 = getmultiplevalues() -- a1 には 1 が、a2 には 'second value' が代入される。 b = getmultiplevalues() -- b には 1 が代入される。ここが、リストでないところがCommon Lispの多値に近いところ。
最後の b への代入の結果、b には最初の値だけが代入され、後の値は捨てられるところが、Common Lispの多値に近いところです。
知ってる範囲で、Common Lisp の多値に一番近い多値を持っているのは、Luaだと思います。
この部分は、Luaを好きな理由の中でも、大きな理由の一つです。
ちなみに、pythonも多値の取扱いはrubyと同じでしたね。Luaもcommon lispと同じように使いやすい多値になってるのは。
由緒正しい多値が使えると、関数の表現力が広がるから使いたいと思うことはありますよね^^