SECDR-Schemeをつくる の0
いわゆる"実装しやすいSchemeインタプリタ"として、SECDマシンが挙げられる。
SECDマシンは、
- Stack
- Environment
- Code (Control)
- Dump
の4つのレジスタ、というよりスタックを持ったVMで、これに対するSchemeコンパイラは比較的簡単に書くことができる。
minischemeの作者によるSECDR-Schemeは上記の4つのレジスタに加えて
- Return
のRレジスタを足したもので、(R[456]RSで要求されるような)真正末尾再帰をより直接的に実現できるようにしている。
今回は、このSECDRマシンによるSchemeをSchemeで実装し、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手続きとして実装できる。