Commit 305b07a5 by Aaron Leung

Refactoring out an apply function. Now we have an eval/apply pair.

parent 6bf362fa
......@@ -42,48 +42,49 @@ namespace Sass {
Token name(n[0].token);
Node args(n[1]);
Node mixin(context.global_env[name]);
Node params(mixin[1]);
Node body(mixin[2].clone());
// Node params(mixin[1]);
// Node body(mixin[2].clone());
n.children->pop_back();
n.children->pop_back();
Environment m_env;
// bind arguments
for (int i = 0, j = 0; i < args.size(); ++i) {
if (args[i].type == Node::assignment) {
Node arg(args[i]);
Token name(arg[0].token);
if (!m_env.query(name)) {
m_env[name] = eval(arg[1], context.global_env);
}
}
else {
// TO DO: ensure (j < params.size())
Node param(params[j]);
Token name(param.type == Node::variable ? param.token : param[0].token);
m_env[name] = eval(args[i], context.global_env);
++j;
}
}
// plug the holes with default arguments if any
for (int i = 0; i < params.size(); ++i) {
if (params[i].type == Node::assignment) {
Node param(params[i]);
Token name(param[0].token);
if (!m_env.query(name)) {
m_env[name] = eval(param[1], context.global_env);
}
}
}
m_env.link(context.global_env);
for (int i = 0; i < body.size(); ++i) {
body[i] = eval(body[i], m_env);
}
// Environment m_env;
// // bind arguments
// for (int i = 0, j = 0; i < args.size(); ++i) {
// if (args[i].type == Node::assignment) {
// Node arg(args[i]);
// Token name(arg[0].token);
// if (!m_env.query(name)) {
// m_env[name] = eval(arg[1], context.global_env);
// }
// }
// else {
// // TO DO: ensure (j < params.size())
// Node param(params[j]);
// Token name(param.type == Node::variable ? param.token : param[0].token);
// m_env[name] = eval(args[i], context.global_env);
// ++j;
// }
// }
// // plug the holes with default arguments if any
// for (int i = 0; i < params.size(); ++i) {
// if (params[i].type == Node::assignment) {
// Node param(params[i]);
// Token name(param[0].token);
// if (!m_env.query(name)) {
// m_env[name] = eval(param[1], context.global_env);
// }
// }
// }
// m_env.link(context.global_env);
//
// for (int i = 0; i < body.size(); ++i) {
// body[i] = eval(body[i], m_env);
// }
//
// n += body;
n += body;
// ideally say: n += apply(mixin, args, context.global_env);
n += apply(mixin, args, context.global_env);
} break;
}
}
......
......@@ -187,4 +187,43 @@ namespace Sass {
}
}
Node apply(const Node& mixin, const Node& args, Environment& env)
{
Node params(mixin[1]);
Node body(mixin[2].clone());
Environment m_env;
// bind arguments
for (int i = 0, j = 0; i < args.size(); ++i) {
if (args[i].type == Node::assignment) {
Node arg(args[i]);
Token name(arg[0].token);
if (!m_env.query(name)) {
m_env[name] = eval(arg[1], env);
}
}
else {
// TO DO: ensure (j < params.size())
Node param(params[j]);
Token name(param.type == Node::variable ? param.token : param[0].token);
m_env[name] = eval(args[i], env);
++j;
}
}
// plug the holes with default arguments if any
for (int i = 0; i < params.size(); ++i) {
if (params[i].type == Node::assignment) {
Node param(params[i]);
Token name(param[0].token);
if (!m_env.query(name)) {
m_env[name] = eval(param[1], env);
}
}
}
m_env.link(env);
for (int i = 0; i < body.size(); ++i) {
body[i] = eval(body[i], m_env);
}
return body;
}
}
\ No newline at end of file
......@@ -14,4 +14,6 @@ namespace Sass {
Node eval(const Node& expr, Environment& env);
Node accumulate(const Node::Type op, Node& acc, Node& rhs);
double operate(const Node::Type op, double lhs, double rhs);
Node apply(const Node& mixin, const Node& args, Environment& env);
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment