LiutCL icon indicating copy to clipboard operation
LiutCL copied to clipboard

为什么Environment要像现在这样实现?

Open Liutos opened this issue 12 years ago • 0 comments

类型Environment,实际上是struct environment_t *的别名,声明于decls.h文件,定义于env_types.h文件中,作用是作为外部环境,提供从符号对象到对应的值之间的映射,即绑定(Binding)。目前的设计是

struct environment_t {
    SymValMap map;
    Environment next_env;
};

成员变量map指向一个单链表,SymValMap是为了存储符号到值的映射而实现的类型,因此map相当于指向了一个关联列表(A-list);成员变量next_env指向外部环境,即创建当前环境时已经存在的一个Environment对象。

之所以这么设计,是为了可以方便在一个环境中增加绑定,即为新的符号添加其和一个值的绑定。如果直接使用map所指向的列表来实现环境,那么在一次对set!调用的解释过程中,就需要修改传入的参数并使之成为传出参数,这要求将eval_sexp函数的Environment类型参数修改为二重指针,不方便维护。

Liutos avatar Nov 03 '12 13:11 Liutos