-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathEnv.cpp
121 lines (103 loc) · 2.29 KB
/
Env.cpp
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <cassert>
#include <string>
#include <unordered_map>
#include "Visitor.h"
#include "Expr.h"
#include "Env.h"
class Expr;
namespace lx {
//! Frame
void
Frame::add_symbol (const std::string& var, Expr* val)
{
#if 0
printf("Add Sym: %s\n", var.c_str());
printf("--------------\n");
val->dump_info();
printf("--------------\n");
#endif
assert(_variables.find(var) == _variables.end());
_variables.insert(std::make_pair(var, val));
}
bool
Frame::set_symbol (const std::string& var, Expr* val)
{
#if 0
printf("Set Sym: %s\n", var.c_str());
printf("--------------\n");
val->dump_info();
printf("--------------\n");
#endif
const auto& iter = _variables.find(var);
if (iter == _variables.end()) {
return false;
} else {
iter->second = val;
return true;
}
}
const Expr*
Frame::query_symbol (const std::string& var) const
{
const auto& iter = _variables.find(var);
if (iter == _variables.end()) {
return nullptr;
} else {
#if 0
printf("Query Sym: %s\n", var.c_str());
printf("--------------\n");
iter->second->dump_info();
printf("--------------\n");
#endif
return iter->second;
}
}
//! Env
void
Env::extend_symbols (std::vector<std::string>& params,
std::vector<Expr*>& args)
{
uint32_t argsSize = args.size();
for (uint32_t i = 0; i < argsSize; i++) {
define_symbol(params[i], args[i]);
}
}
const Expr*
Env::query_symbol (const std::string& var) const
{
const Expr* ret = _frame.query_symbol(var);
if (!ret && _upperEnv) {
ret = _upperEnv->query_symbol(var);
}
if (!ret) {
printf("[Warning] Cannot find symbol %s\n", var.c_str());
}
return ret;
}
bool
Env::set_symbol (const std::string& var, Expr* val)
{
// FIXME
Eval eval;
val = eval.call(val, *this);
if (_frame.set_symbol(var, val)) {
return true;
} else if (_upperEnv) {
return _upperEnv->set_symbol(var, val);
} else {
return false;
}
}
void
Env::define_symbol (const std::string& var, Expr* val)
{
// FIXME
Eval eval;
val = eval.call(val, *this);
if (_frame.query_symbol(var)) {
_frame.set_symbol(var, val);
} else {
_frame.add_symbol(var, val);
}
}
}