CELL* m_GlobalEnvir;La creación de esa celda se va a realizar cuando iniciemos todo el sistema del lenguaje script. En el constructor de la clase Script.
Script() : m_FirstUnused(NULL) { m_GlobalEnvir=&CreateEnvir(NULL); }Recordemos que m_FirstUnused se usaba para reutilizar las celdas recicladas por el recolector de basura.
Lo importante es que m_GlobalEnvir no va a cambiar y siempre va a ser un entorno. Vimos la función CreateEnvir() en la parte 11. En la parte 6 explicamos que una celda de entorno (de tipo ENVIR_VAL) sólo tiene un puntero a una tabla hash o árbol de búsqueda así que, como lo que vamos a hacer con este entorno es definir símbolos en él, sera muy útil obtener directamente la tabla del entorno global.
ENVIR_TABLE& GlobalEnvirTable()const { return *m_GlobalEnvir->envir_table; }La mayor parte de símbolos que vamos a definir en la tabla del entorno global son operaciones nativas. La función DefineGlobalNative() nos ahorra tener que llamar a CreateName() y CreateNative() cada vez.
void DefineGlobalNative(STRING const& name, NATIVE nat) { (*m_GlobalEnvir->envir_table)[&CreateName(name)]=&CreateNative(nat); }Finalmente, poblaremos la tabla del entorno global con la función DefineUsualSymbols(). Se declara así en la clase Script.
void DefineUsualSymbols();Y se define así.
void Script::DefineUsualSymbols() { DefineGlobalNative(L"=", &Native_Set); DefineGlobalNative(L"+", &Native_Add); DefineGlobalNative(L"-", &Native_Sub); DefineGlobalNative(L"*", &Native_Mul); DefineGlobalNative(L"&", &Native_BAnd); DefineGlobalNative(L"|", &Native_BOr); DefineGlobalNative(L"^", &Native_BXor); DefineGlobalNative(L"/", &Native_Div); DefineGlobalNative(L"%", &Native_Mod); DefineGlobalNative(L"==", &Native_Eq); DefineGlobalNative(L"!=", &Native_Ne); DefineGlobalNative(L"<", &Native_Lt); DefineGlobalNative(L"<=", &Native_Le); DefineGlobalNative(L">", &Native_Gt); DefineGlobalNative(L">=", &Native_Ge); DefineGlobalNative(L"if", &Native_If); DefineGlobalNative(L"let", &Native_Let); DefineGlobalNative(L"while", &Native_While); DefineGlobalNative(L"begin", &Native_Begin); DefineGlobalNative(L"define", &Native_Define); DefineGlobalNative(L"set", &Native_Set); DefineGlobalNative(L"lambda", &Native_Lambda); (*m_GlobalEnvir->envir_table)[&CreateName(L"true")]=&CreateBool(true); (*m_GlobalEnvir->envir_table)[&CreateName(L"false")]=&CreateBool(false); }La mayoría de estas funciones nativas (hemos prefijado el nombre con Native_ para distinguirlas claramente) todavía no están definidas. Lo haremos en las partes de la 26 a la 31.
Antes nos vamos a dedicar a la evaluación, puesto que tenemos ya especificado todo lo que hace falta para explicarla.
0 comentarios:
Publicar un comentario