LiutCL
LiutCL copied to clipboard
为什么Environment要像现在这样实现?
类型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类型参数修改为二重指针,不方便维护。