Previous: , Up: 制御構造   [Contents][Index]


4.8 多値

Common Lisp関数は0個またはそれ以上の結果を戻すことができる。Emacs Lisp 関数は、対称的に常に正確に1つの結果を戻す。このパッケージはCommon Lisp 多重戻り値のエミュレートを試みない; 1つ以上の値を戻すCommon Lisp関数の Emacs版は、(compiler-macroexpandでのように)単に最初の値を 戻すか、(get-setf-methodでのように)値のリストを戻す。この パッケージは、多値とともに動作するCommon Lisp関数のための場所確保を 定義するが、Emacs Lispでは、それらの関数はその代わりに単に リスト上で作用する。たとえば、valuesフォームはEmacsでは listの同義語である。

Special Form: multiple-value-bind (var…) values-form forms…

このフォームはvalues-formを評価する。values-formは値の リストを戻さなければならない。それからvar達をlet でのようにそれぞれの値で束縛し、本体formsを実行する。値より 多くのvar達がある場合、余分のvar達はnilに 束縛される。var達が値より少ない場合、余分の値は無視される。

Special Form: multiple-value-setq (var…) form

このフォームはformを評価する。formは値のリストを 戻さなければならない。それからvar達にsetq でのようにそれぞれの値を設定する。余分のvar達や値は multiple-value-bindと同様に扱われる。

より古いQuirozのパッケージは、Common Lisp多値のより忠実な (しかしなお不完全な)エミュレーションを試みた。古い方法は“通常は”真の 多値をきわめてうまくシミュレートしたが、ある条件下では、メモリ中に後に 無関係なmultiple-value-bindフォームが見るような偽の戻り値を 残す。

Emacs Lispでは完全なエミュレーションは実現不可能なので、この パッケージは可能な限り単純に、そして予測可能なようにすることを選んだ。