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