-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEnvironment.cpp
More file actions
58 lines (48 loc) · 1.02 KB
/
Environment.cpp
File metadata and controls
58 lines (48 loc) · 1.02 KB
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
#include "Environment.h"
#include "SValue.h"
#include <iomanip>
Environment::Environment( Environment* parent ) : parent( parent )
{}
SValue* Environment::get( const Symbol& sym, SValue* v ) const
{
auto it = env.find( sym );
// Found in local environment.
if ( it != env.end() )
{
// Copy value.
v->value = it->second->value;
}
else if ( parent )
{
// Try parent.
parent->get( sym, v );
}
else
{
error( v, sym.label + " not found" );
}
return v;
}
void Environment::set( const Symbol& sym, const SValue& v )
{
env[ sym ] = std::make_shared< SValue >( v );
}
void Environment::rootSet( const Symbol& s, const SValue& v )
{
// Find root. An environment with no parent.
Environment* root = this;
while ( root->parent )
{
root = root->parent;
}
root->set( s, v );
}
std::ostream& operator<<( std::ostream& o, const Environment& e )
{
for ( const auto& [ symbol, value ] : e.env )
{
o << std::setw( 10 ) << symbol << ": ";
show( o, *value ) << '\n';
}
return o;
}