@@ -71,7 +71,7 @@ class Env
71
71
class Expr
72
72
{
73
73
public:
74
- virtual ExprPtr eval (Env& env) = 0;
74
+ virtual ExprPtr eval (std::shared_ptr< Env> const & env) = 0;
75
75
virtual std::string toString () const = 0;
76
76
virtual ~Expr () = default ;
77
77
};
@@ -84,7 +84,7 @@ class Literal : public Expr
84
84
Literal (Value value)
85
85
: mValue {value}
86
86
{}
87
- ExprPtr eval (Env& env) override
87
+ ExprPtr eval (std::shared_ptr< Env> const & env) override
88
88
{
89
89
return ExprPtr{new Literal (mValue )};
90
90
}
@@ -107,9 +107,9 @@ class Variable final : public Expr
107
107
Variable (std::string const & name)
108
108
: mName {name}
109
109
{}
110
- ExprPtr eval (Env& env) override
110
+ ExprPtr eval (std::shared_ptr< Env> const & env) override
111
111
{
112
- return env. lookupVariableValue (mName );
112
+ return env-> lookupVariableValue (mName );
113
113
}
114
114
std::string name () const
115
115
{
@@ -125,7 +125,7 @@ class Quoted final : public Expr
125
125
{
126
126
ExprPtr mContent ;
127
127
public:
128
- ExprPtr eval (Env& env) override
128
+ ExprPtr eval (std::shared_ptr< Env> const & env) override
129
129
{
130
130
return mContent ;
131
131
}
@@ -142,9 +142,9 @@ class Assignment final : public Expr
142
142
, mValue {value}
143
143
{
144
144
}
145
- ExprPtr eval (Env& env) override
145
+ ExprPtr eval (std::shared_ptr< Env> const & env) override
146
146
{
147
- return env. setVariableValue (dynamic_cast <Variable*>(mVariable .get ())->name (), mValue ->eval (env));
147
+ return env-> setVariableValue (dynamic_cast <Variable*>(mVariable .get ())->name (), mValue ->eval (env));
148
148
}
149
149
std::string toString () const override
150
150
{
@@ -162,7 +162,7 @@ class Definition final : public Expr
162
162
, mValue {value}
163
163
{
164
164
}
165
- ExprPtr eval (Env& env) override ;
165
+ ExprPtr eval (std::shared_ptr< Env> const & env) override ;
166
166
std::string toString () const override
167
167
{
168
168
return " Definition ( " + mVariable ->toString () + " : " + mValue ->toString () + " )" ;
@@ -187,7 +187,7 @@ class If final : public Expr
187
187
, mConsequent {consequent}
188
188
, mAlternative {alternative}
189
189
{}
190
- ExprPtr eval (Env& env) override
190
+ ExprPtr eval (std::shared_ptr< Env> const & env) override
191
191
{
192
192
return isTrue (mPredicate ->eval (env)) ? mConsequent ->eval (env) : mAlternative ->eval (env);
193
193
}
@@ -204,7 +204,7 @@ class Sequence final : public Expr
204
204
Sequence (std::vector<ExprPtr> actions)
205
205
: mActions {actions}
206
206
{}
207
- ExprPtr eval (Env& env) override
207
+ ExprPtr eval (std::shared_ptr< Env> const & env) override
208
208
{
209
209
assert (mActions .size () >= 1 );
210
210
for (size_t i = 0 ; i < mActions .size () - 1 ; i++)
@@ -229,7 +229,7 @@ class Lambda final : public Expr
229
229
, mBody {body}
230
230
{
231
231
}
232
- ExprPtr eval (Env& env) override ;
232
+ ExprPtr eval (std::shared_ptr< Env> const & env) override ;
233
233
std::string toString () const override
234
234
{
235
235
return " Lambda" ;
@@ -240,11 +240,11 @@ class Cond final : public Expr
240
240
{
241
241
std::shared_ptr<Expr> mClauses ;
242
242
public:
243
- ExprPtr eval (Env& env) override ;
243
+ ExprPtr eval (std::shared_ptr< Env> const & env) override ;
244
244
std::string toString () const override ;
245
245
};
246
246
247
- inline std::vector<ExprPtr> listOfValues (std::vector<ExprPtr> const & exprs, Env& env)
247
+ inline std::vector<ExprPtr> listOfValues (std::vector<ExprPtr> const & exprs, std::shared_ptr< Env> const & env)
248
248
{
249
249
std::vector<ExprPtr> values;
250
250
std::transform (exprs.begin (), exprs.end (), std::back_insert_iterator (values), [&env](ExprPtr const & e)
@@ -269,7 +269,7 @@ class PrimitiveProcedure : public Procedure
269
269
PrimitiveProcedure (Func func)
270
270
: mImplementation {func}
271
271
{}
272
- ExprPtr eval (Env& env) override
272
+ ExprPtr eval (std::shared_ptr< Env> const & env) override
273
273
{
274
274
return ExprPtr{new PrimitiveProcedure{mImplementation }};
275
275
}
@@ -289,18 +289,18 @@ class CompoundProcedure : public Procedure
289
289
std::vector<std::string> mParameters ;
290
290
std::shared_ptr<Env> mEnvironment ;
291
291
public:
292
- CompoundProcedure (std::shared_ptr<Sequence> body, std::vector<std::string> parameters, std::shared_ptr<Env> environment)
292
+ CompoundProcedure (std::shared_ptr<Sequence> body, std::vector<std::string> parameters, std::shared_ptr<Env> const & environment)
293
293
: mBody {body}
294
294
, mParameters {parameters}
295
295
, mEnvironment {environment}
296
296
{}
297
- ExprPtr eval (Env& env) override
297
+ ExprPtr eval (std::shared_ptr< Env> const & env) override
298
298
{
299
299
return ExprPtr{new CompoundProcedure{mBody , mParameters , mEnvironment }};
300
300
}
301
301
std::shared_ptr<Expr> apply (std::vector<std::shared_ptr<Expr>> const & args) override
302
302
{
303
- return mBody ->eval (* mEnvironment ->extend (mParameters , args));
303
+ return mBody ->eval (mEnvironment ->extend (mParameters , args));
304
304
}
305
305
std::string toString () const override
306
306
{
@@ -317,9 +317,9 @@ class Application final : public Expr
317
317
: mOperator {op}
318
318
, mOperands {params}
319
319
{}
320
- ExprPtr eval (Env& env) override
320
+ ExprPtr eval (std::shared_ptr< Env> const & env) override
321
321
{
322
- auto op = mOperator ->eval (env)-> eval (env) ;
322
+ auto op = mOperator ->eval (env);
323
323
auto args = listOfValues (mOperands , env);
324
324
return dynamic_cast <Procedure&>(*op).apply (args);
325
325
}
0 commit comments