Common Lisp関数は0個またはそれ以上の結果を戻すことができる。Emacs Lisp
関数は、対称的に常に正確に1つの結果を戻す。このパッケージはCommon Lisp
多重戻り値のエミュレートを試みない; 1つ以上の値を戻すCommon Lisp関数の
Emacs版は、(compiler-macroexpand
でのように)単に最初の値を
戻すか、(get-setf-method
でのように)値のリストを戻す。この
パッケージは、多値とともに動作するCommon Lisp関数のための場所確保を
定義するが、Emacs Lispでは、それらの関数はその代わりに単に
リスト上で作用する。たとえば、values
フォームはEmacsでは
list
の同義語である。
このフォームはvalues-formを評価する。values-formは値の
リストを戻さなければならない。それからvar達をlet
でのようにそれぞれの値で束縛し、本体formsを実行する。値より
多くのvar達がある場合、余分のvar達はnil
に
束縛される。var達が値より少ない場合、余分の値は無視される。
このフォームはformを評価する。formは値のリストを
戻さなければならない。それからvar達にsetq
でのようにそれぞれの値を設定する。余分のvar達や値は
multiple-value-bind
と同様に扱われる。
より古いQuirozのパッケージは、Common Lisp多値のより忠実な
(しかしなお不完全な)エミュレーションを試みた。古い方法は“通常は”真の
多値をきわめてうまくシミュレートしたが、ある条件下では、メモリ中に後に
無関係なmultiple-value-bind
フォームが見るような偽の戻り値を
残す。
Emacs Lispでは完全なエミュレーションは実現不可能なので、この パッケージは可能な限り単純に、そして予測可能なようにすることを選んだ。