xo-expression: refactor: xtract -> method regularize_layer_vars()
This commit is contained in:
parent
fdfe2e7270
commit
a76c835477
2 changed files with 33 additions and 19 deletions
|
|
@ -91,6 +91,14 @@ namespace xo {
|
||||||
/** compute free-variable set for this lambda **/
|
/** compute free-variable set for this lambda **/
|
||||||
std::set<std::string> calc_free_variables() const;
|
std::set<std::string> calc_free_variables() const;
|
||||||
|
|
||||||
|
/** ensure at most one Variable instance with a particular name
|
||||||
|
* in this lambda, but ignore nested lambdas.
|
||||||
|
*
|
||||||
|
* Goal is to unify variables that can use the same binding
|
||||||
|
* path to determine memory location at runtime.
|
||||||
|
**/
|
||||||
|
void regularize_layer_vars();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** lambda name. Initially supporting only form like
|
/** lambda name. Initially supporting only form like
|
||||||
* (define (foo x y z)
|
* (define (foo x y z)
|
||||||
|
|
|
||||||
|
|
@ -69,25 +69,9 @@ namespace xo {
|
||||||
return retval;
|
return retval;
|
||||||
} /*calc_free_variables*/
|
} /*calc_free_variables*/
|
||||||
|
|
||||||
Lambda::Lambda(const std::string & name,
|
void
|
||||||
TypeDescr lambda_type,
|
Lambda::regularize_layer_vars()
|
||||||
const rp<LocalEnv> & local_env,
|
|
||||||
const ref::rp<Expression> & body)
|
|
||||||
: FunctionInterface(exprtype::lambda, lambda_type),
|
|
||||||
name_{name},
|
|
||||||
body_{body},
|
|
||||||
local_env_{local_env}
|
|
||||||
{
|
{
|
||||||
stringstream ss;
|
|
||||||
ss << "double";
|
|
||||||
ss << "(";
|
|
||||||
for (std::size_t i = 0, n = this->n_arg(); i < n; ++i) {
|
|
||||||
if (i > 0)
|
|
||||||
ss << ",";
|
|
||||||
ss << "double";
|
|
||||||
}
|
|
||||||
ss << ")";
|
|
||||||
|
|
||||||
/* regularize local_env+body: make sure exactly one instance
|
/* regularize local_env+body: make sure exactly one instance
|
||||||
* (i.e. with object identity) of a Variable appears
|
* (i.e. with object identity) of a Variable appears
|
||||||
* within one layer of a lambda body.
|
* within one layer of a lambda body.
|
||||||
|
|
@ -133,11 +117,33 @@ namespace xo {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
} /*regularize_layer_vars*/
|
||||||
|
|
||||||
|
Lambda::Lambda(const std::string & name,
|
||||||
|
TypeDescr lambda_type,
|
||||||
|
const rp<LocalEnv> & local_env,
|
||||||
|
const ref::rp<Expression> & body)
|
||||||
|
: FunctionInterface(exprtype::lambda, lambda_type),
|
||||||
|
name_{name},
|
||||||
|
body_{body},
|
||||||
|
local_env_{local_env}
|
||||||
|
{
|
||||||
|
stringstream ss;
|
||||||
|
ss << "double";
|
||||||
|
ss << "(";
|
||||||
|
for (std::size_t i = 0, n = this->n_arg(); i < n; ++i) {
|
||||||
|
if (i > 0)
|
||||||
|
ss << ",";
|
||||||
|
ss << "double";
|
||||||
|
}
|
||||||
|
ss << ")";
|
||||||
|
|
||||||
this->type_str_ = ss.str();
|
this->type_str_ = ss.str();
|
||||||
this->free_var_set_ = this->calc_free_variables();
|
this->free_var_set_ = this->calc_free_variables();
|
||||||
|
|
||||||
body_->attach_envs(local_env_);
|
this->regularize_layer_vars();
|
||||||
|
|
||||||
|
this->body_->attach_envs(local_env_);
|
||||||
} /*ctor*/
|
} /*ctor*/
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue