您无需在Java中实现太多.
甚至S表达式解析也可以在Lisp中实现,而Java部分仅负责读取一些简单的序列化形式.例如,在像(a(b c))的Forth语法中, a b c NIL. .零. .,哪里.使一个坏细胞.
Java运行时应提供最少的原语集.无需支持完整的Lisp语义,在Lisp本身中将编译器从“完整的” Lisp实施为简化的引导语言会更容易.引导程序语言可能支持以下原语:
> FUNCTION,制作具有给定数量的参数和给定主体的函数对象
> ARG,访问函数的第n个参数
> VAR,访问闭合的第n个插槽
> IF原语
>应用原始
> CONST原语
> CLOSURE原语-与功能对象相似,但初始化了许多关闭环境插槽
用Java实现这种解释器很容易,上面的所有原语都是使用方法Run(Environment env)实现相同AstNode接口的类.
在Lisp方面,必须实现一个简单的“编译器”,它将执行lambda提升和变量枚举. let,let *等之类的东西可以实现为简单的宏(使用Lisp本身也可以实现宏扩展器).
Java提供的最少的运行时库函数集应包含car,cdr,cons,listp,nullp,符??号到字符串和字符串到符号的转换,字符串串联以及对Java反射的访问,以实现Lisp方面的所有其他功能.
当然,这种解释器的效率不是很高-例如,您必须通过Y-combinator实现递归函数.但是,您只需要使用它来引导语言的下一个迭代,当然也可以在Lisp中实现,它将相同的源语言编译为Java字节码.
变化是可能的-例如,可以实现一个简单的graph reduction引擎而不是上面的解释器,它甚至更简单,但效率更低.