VM 命令 erebind のバグを修正
Scheme コンパイラと REPL コードのコンパイル方法を変更

scythe コマンドに -e <expr> を指定し、<expr> 部分に compile-file プロシージャ
の呼び出しとその戻り値の write を行う Scheme コードを指定していた。これを
scythe-compile-file というコンパイル用のコマンドを用意し、その引数にコンパイ
ル対象のファイルを指定する方法に変更した。

VM とコンパイラにまたがる変更しようとする場合、以下のような手順になる。変更
前では、4 番の手順にて -e <expr> の <expr> が新コンパイラでコンパイルされる
が、生成された命令列に VM 側が対応していないため、エラーが発生してしまう。そ
のため、compile-file の呼び出しと write を実装言語 (C) 側で行うよう変更した。

1. コンパイラを変更
2. 旧コンパイラで新コンパイラをコンパイル
3. ビルド
4. 新コンパイラ(旧コンパイラでコンパイルされたもの)で新コンパイラをコンパイ
   ル
5. VM の変更
scm_capi_vector_push を追加
VM 命令の ARITY を廃止し、MRVC/MRVE を追加。多値関連の処理方法を変更。

[追加 VM 命令]
+ MRVC: Multiple-Return-Value Check
  VM の vc レジスタとオペランド値を比較し一致しなければエラーを発生させる。
  また、オペランド値が 0 未満である場合はオプショナルな多値のリスト化も行う。
  オペランド値の解釈はプロシージャの arity と同じ。

+ MRVE: Multiple-Return-Value Error
  無条件でエラーを発生させる。
  (命令長が NOP 命令と同じ必要がある)

[VM の動作]
RETURN 命令を実行するとき、vc レジスタ値が 1 であるなら、継続フレームに保存
されたインストラクションポインタに NOP 命令長を足した場所から命令列の実行を行
う。vc レジスタ値が 1 でない場合は継続フレームに保存されたインストラクション
ポインタの値の場所から命令列の実行を行う。

[多値のコンパイル]
+ 戻り値が多値ではないことを期待している場合
  (例: (define var (func)) の func の戻り値)

  CALL     ; call func
  MRVE     ; multiple-value return point
  …       ; single-value return point

+ 戻り値の数が任意で問題ない場合
  (例: (begin (func1) (func2)) の func1 の戻り値)

  CALL     ; call func1
  NOP      ; multiple-value return point
  …       ; single-value return point

+ 戻り値の数が多値であることを期待している場合
  (例: (let-values (((v1 v2) (func))) …) の func の戻り値)

  CALL     ; call func
  NOP      ; multiple-value return point
  MRVC 2   ; single-value return point
  …
scm_capi_trompolining の仕様を変更

引数 handover が SCM_OBJ_NULL の場合、portproc の呼び出しの第一引数に nil を
渡していたが (proc の戻り値は常に第二引数で渡していた)、proc の戻り値が第一
引数になるよう変更
call-with-values をクロージャによる実装からサブルーチンによる実装へ変更
scm_api_assemble のバグを修正
select-module シンタックスのコンパイラバグを修正
memq、memv、assq、assv サブルーチンを実装
テスト用に例外オブジェクト用のメッセージを出力する関数を追加
let-values、let*-values シンタックスを実装
eval の結果が多値を許容できるようコンパイラを変更
eval の結果が多値の場合、値を全て表示するよう REPL を変更
procedure? プロシージャをサブルーチンとして実装
apply プロシージャをサブルーチンとして実装
scm_capi_trampolining のバグを修正
コンパイラのバグを修正
VM 命令 PUSH のバグを修正
ローカル変数による参照の GC への登録漏れを修正
コンパイル処理を 2 phases に分離。

+ 1st phase
変数の参照の解決を行い、S 式を中間形式に変換

+ 2nd phase
中間形式を元にアセンブリコードを生成