Skip to content

liumingc/eval

Repository files navigation

一个简化的scheme 解释器/编译器。

数据类型

  • boolean,#t, #f
  • number
  • string
  • symbol
  • function,包括基本过程、复合过程
  • list/pair,空表()也归入此列

内部表示。如果对基本类型,也使用('bool <val>), ('str val)... 的方式,那么数据的表示方式就统一了。 但是有点麻烦,因为判断boolean的时候,不能直接用eq?,而要(equal? expr '(bool #f))了。 而且,基本的操作,如+, -, >, string=?都要自己在解释层重新实现一遍,相当麻烦。 所以,暂时的,对基本类型,直接使用原始数据,不使用tag-list的方式吧(?)。

环境

使用hash + pair的方式。 (<hash> <link>),link指向外层的env。 提供以下API:

  • lookup
  • extend
  • env-add 用于处理def
  • env-set! 用于处理set!

语法形式

  • def
  • set!
  • if
  • fn
    lambda 写起来太麻烦了,使用fn。
  • quote
  • quasiquote, unquote, unquote-splicing
  • begin
  • call/cc
  • defmacro

性能优化

暂时不是考虑的重点。

参考书目

  • SICP
    抽象屏障当然重要,但是感觉书中的例子,也太啰嗦了,可读性也没有太大的提高。 不如dybvig使用record、record-case写的简洁、易读。
  • 编译器原理
  • arc的源码

About

learning SICP, writing interpreter/compiler. using racket

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published