Skip to content

Commit 09f50d8

Browse files
author
Bowen Fu
committed
Lambda recursive calls
1 parent 47b58fe commit 09f50d8

File tree

3 files changed

+24
-28
lines changed

3 files changed

+24
-28
lines changed

evaluator.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
#include "evaluator.h"
22

3-
ExprPtr Lambda::eval(Env& env)
3+
ExprPtr Lambda::eval(std::shared_ptr<Env> const& env)
44
{
5-
CompoundProcedure proc{mBody, mParameters, std::make_shared<Env>(env)};
5+
CompoundProcedure proc{mBody, mParameters, env};
66
return std::shared_ptr<Expr>(new CompoundProcedure(proc));
77
}
88

9-
ExprPtr Definition::eval(Env& env)
9+
ExprPtr Definition::eval(std::shared_ptr<Env> const& env)
1010
{
11-
if (dynamic_cast<Lambda*>(mValue.get()))
12-
{
13-
return env.defineVariable(dynamic_cast<Variable*>(mVariable.get())->name(), mValue);
14-
}
15-
return env.defineVariable(dynamic_cast<Variable*>(mVariable.get())->name(), mValue->eval(env));
11+
return env->defineVariable(dynamic_cast<Variable*>(mVariable.get())->name(), mValue->eval(env));
1612
}
1713

1814
#if 0

evaluator.h

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class Env
7171
class Expr
7272
{
7373
public:
74-
virtual ExprPtr eval(Env& env) = 0;
74+
virtual ExprPtr eval(std::shared_ptr<Env> const& env) = 0;
7575
virtual std::string toString() const = 0;
7676
virtual ~Expr() = default;
7777
};
@@ -84,7 +84,7 @@ class Literal : public Expr
8484
Literal(Value value)
8585
: mValue{value}
8686
{}
87-
ExprPtr eval(Env& env) override
87+
ExprPtr eval(std::shared_ptr<Env> const& env) override
8888
{
8989
return ExprPtr{new Literal(mValue)};
9090
}
@@ -107,9 +107,9 @@ class Variable final : public Expr
107107
Variable(std::string const& name)
108108
: mName{name}
109109
{}
110-
ExprPtr eval(Env& env) override
110+
ExprPtr eval(std::shared_ptr<Env> const& env) override
111111
{
112-
return env.lookupVariableValue(mName);
112+
return env->lookupVariableValue(mName);
113113
}
114114
std::string name() const
115115
{
@@ -125,7 +125,7 @@ class Quoted final : public Expr
125125
{
126126
ExprPtr mContent;
127127
public:
128-
ExprPtr eval(Env& env) override
128+
ExprPtr eval(std::shared_ptr<Env> const& env) override
129129
{
130130
return mContent;
131131
}
@@ -142,9 +142,9 @@ class Assignment final : public Expr
142142
, mValue{value}
143143
{
144144
}
145-
ExprPtr eval(Env& env) override
145+
ExprPtr eval(std::shared_ptr<Env> const& env) override
146146
{
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));
148148
}
149149
std::string toString() const override
150150
{
@@ -162,7 +162,7 @@ class Definition final : public Expr
162162
, mValue{value}
163163
{
164164
}
165-
ExprPtr eval(Env& env) override;
165+
ExprPtr eval(std::shared_ptr<Env> const& env) override;
166166
std::string toString() const override
167167
{
168168
return "Definition ( " + mVariable->toString() + " : " + mValue->toString() + " )";
@@ -187,7 +187,7 @@ class If final : public Expr
187187
, mConsequent{consequent}
188188
, mAlternative{alternative}
189189
{}
190-
ExprPtr eval(Env& env) override
190+
ExprPtr eval(std::shared_ptr<Env> const& env) override
191191
{
192192
return isTrue(mPredicate->eval(env)) ? mConsequent->eval(env) : mAlternative->eval(env);
193193
}
@@ -204,7 +204,7 @@ class Sequence final : public Expr
204204
Sequence(std::vector<ExprPtr> actions)
205205
: mActions{actions}
206206
{}
207-
ExprPtr eval(Env& env) override
207+
ExprPtr eval(std::shared_ptr<Env> const& env) override
208208
{
209209
assert(mActions.size() >= 1);
210210
for (size_t i = 0; i < mActions.size() - 1; i++)
@@ -229,7 +229,7 @@ class Lambda final : public Expr
229229
, mBody{body}
230230
{
231231
}
232-
ExprPtr eval(Env& env) override;
232+
ExprPtr eval(std::shared_ptr<Env> const& env) override;
233233
std::string toString() const override
234234
{
235235
return "Lambda";
@@ -240,11 +240,11 @@ class Cond final : public Expr
240240
{
241241
std::shared_ptr<Expr> mClauses;
242242
public:
243-
ExprPtr eval(Env& env) override;
243+
ExprPtr eval(std::shared_ptr<Env> const& env) override;
244244
std::string toString() const override;
245245
};
246246

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)
248248
{
249249
std::vector<ExprPtr> values;
250250
std::transform(exprs.begin(), exprs.end(), std::back_insert_iterator(values), [&env](ExprPtr const& e)
@@ -269,7 +269,7 @@ class PrimitiveProcedure : public Procedure
269269
PrimitiveProcedure(Func func)
270270
: mImplementation{func}
271271
{}
272-
ExprPtr eval(Env& env) override
272+
ExprPtr eval(std::shared_ptr<Env> const& env) override
273273
{
274274
return ExprPtr{new PrimitiveProcedure{mImplementation}};
275275
}
@@ -289,18 +289,18 @@ class CompoundProcedure : public Procedure
289289
std::vector<std::string> mParameters;
290290
std::shared_ptr<Env> mEnvironment;
291291
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)
293293
: mBody{body}
294294
, mParameters{parameters}
295295
, mEnvironment{environment}
296296
{}
297-
ExprPtr eval(Env& env) override
297+
ExprPtr eval(std::shared_ptr<Env> const& env) override
298298
{
299299
return ExprPtr{new CompoundProcedure{mBody, mParameters, mEnvironment}};
300300
}
301301
std::shared_ptr<Expr> apply(std::vector<std::shared_ptr<Expr>> const& args) override
302302
{
303-
return mBody->eval(*mEnvironment->extend(mParameters, args));
303+
return mBody->eval(mEnvironment->extend(mParameters, args));
304304
}
305305
std::string toString() const override
306306
{
@@ -317,9 +317,9 @@ class Application final : public Expr
317317
: mOperator{op}
318318
, mOperands{params}
319319
{}
320-
ExprPtr eval(Env& env) override
320+
ExprPtr eval(std::shared_ptr<Env> const& env) override
321321
{
322-
auto op = mOperator->eval(env)->eval(env);
322+
auto op = mOperator->eval(env);
323323
auto args = listOfValues(mOperands, env);
324324
return dynamic_cast<Procedure&>(*op).apply(args);
325325
}

parser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ int32_t main()
275275
}
276276
#endif
277277

278-
Env env{};
278+
auto env = std::make_shared<Env>();
279279

280280
using Number = Literal<double>;
281281
auto mul = [](std::vector<std::shared_ptr<Expr>> const& args)

0 commit comments

Comments
 (0)