SECDR-Schemeをつくる の0

いわゆる"実装しやすいSchemeインタプリタ"として、SECDマシンが挙げられる。
SECDマシンは、

  • Stack
  • Environment
  • Code (Control)
  • Dump

の4つのレジスタ、というよりスタックを持ったVMで、これに対するSchemeコンパイラは比較的簡単に書くことができる。
minischemeの作者によるSECDR-Schemeは上記の4つのレジスタに加えて

  • Return

のRレジスタを足したもので、(R[456]RSで要求されるような)真正末尾再帰をより直接的に実現できるようにしている。
今回は、このSECDRマシンによるSchemeSchemeで実装し、R6RS下位互換実装を目指す。(syntax-caseを除き、R6RS風のライブラリシステムとsyntax-rules、explicit-renamingのみを持たせる。)

SECDR-Scheme

元になるSECDR-Schemeの実装は↑にある(GPLv2)。これは、R4RS Schemeの実装で、slibが実行できる程度に互換性が有る。
VM本体はSECDR/secdrcyc.cに有り、コンパイラはSECDR/compiler.scmに有る。どちらも非常にコンパクトで、理解は難しくない。
(macro-expandを除くと、)このコンパイラが取る"core scheme"、つまり、言語コアは

  • if
  • set!
  • define (internal define用のdefine)
  • global-define (global define用のdefine)
  • lambda
  • begin
  • quote

の7構文しかない。他に、VMの内部状態にアクセスするcore手続きがいくつか存在する(コンパイラはこれらもprimitiveとして取り扱う)。例えば、call/ccはcore手続きとして実装できる。