/
enviroment.h
executable file
·69 lines (52 loc) · 1.87 KB
/
enviroment.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef _ENVIROMENT_H
#define _ENVIROMENT_H
#include <map>
#include <string>
#include <iostream>
#include "datetypes.h"
class Elem;
class LList;
class LSymbol;
class LFunctionC;
using namespace std;
//! Enviroment - prostředí ve kterém se provádí kód
class Enviroment {
public:
//! Implicitní konstuktor - vytvoří prázdný enviroment a definuje primitivní symboly
Enviroment();
//! Korektně fungující kopírující konstruktor.
Enviroment(Enviroment&);
//! definuje symbol (proměnou)
void define(string name, Elem * val);
//! Vypíše všecky definované symboly v aktuálním enviromentu
void vardump();
/*! evalAll - vyhodnotí parametry volání jen lispovské funkce (makra a
* primitivní funkce se evaluují jinak). Používá se kvůli call-by-value.
* @param expr - parametry funkce
* @return nový seznam kde je každý prvek z expr evaluován
*/
LList* evalAll(LList* expr);
/*! vyhodnotí seznam (+ 1 2)
* Pravidla vyhodnocování: int a string se vyhodnocují na sebe.
* symbol se vyhodnocuje na co představuje (pomocí tabulky symbolů this->symbols)
* U seznamu se předpokládá že to je volání funkce. Jestli je to lispovská
* funkce tak se evaluují parametry a funkce se zavolá. U primitivních funkcí
* (v C) a maker se parametry neevalují.
*/
Elem* eval(Elem* expr);
//! Vyhodnotí seznam seznamů ((+ 1 2) (* 5 6))
//! @return hodnotu posledního výrazu
Elem* progn(LList* expr);
// Elem* eval(LSymbol *expr) ;
//
// Elem* eval(LInt *expr) ;
//
// Elem* eval(LString *expr);
//
// Elem* eval(LList *expr);
//! Tabulka definovaných symbolů
map<string, Elem *> symbols;
//! Odkaz na nadřazený enviroment (kvůli fci exportall)
Enviroment * parent;
};
#endif /* _ENVIROMENT_H */