1 changed files with 50 additions and 0 deletions
@ -0,0 +1,50 @@ |
|||
/* |
|||
* An environment is just an object that maps identifiers to JLambda expressions |
|||
* with a few built-in (a standard Prelude environment) |
|||
*/ |
|||
|
|||
// returns the new environment after mutating it
|
|||
// values = [(identifier, JLambda expression)]
|
|||
|
|||
var errors = require("./errors.js"); |
|||
var rep = require("./representation.js"); |
|||
|
|||
|
|||
function extend(env, values) { |
|||
for (var i = 0; i < values.length; i++) { |
|||
env[values[i][0].val] = values[i][1]; |
|||
} |
|||
return env; |
|||
} |
|||
|
|||
// creates a new environment initialized with the pairs in values
|
|||
function makeEnv(name, values) { |
|||
var env = {}; |
|||
env.name = name; |
|||
for (var i = 0; i < values.length; i++) { |
|||
var name = values[i][0].val; |
|||
var val = values[i][1]; |
|||
env[name] = val; |
|||
} |
|||
return env; |
|||
} |
|||
|
|||
function lookup(name, env) { |
|||
var value = env[name]; |
|||
if (!value) { |
|||
throw errors.UnboundError(name, env.name); |
|||
} |
|||
return value; |
|||
} |
|||
|
|||
var prelude = makeEnv("prelude", [[new rep.Name("e"), new rep.FloatT(Math.E)], |
|||
[new rep.Name("pi"), new rep.FloatT(Math.PI)]]); |
|||
|
|||
var prelude_types = makeEnv("prelude_types", |
|||
[[new rep.Name("e"), new rep.TypeOp("Float", [], false)], |
|||
[new rep.Name("pi"), new rep.TypeOp("Float", [], false)]]); |
|||
|
|||
module.exports = { prelude : prelude, |
|||
prelude_types : prelude_types, |
|||
lookup : lookup, |
|||
extend : extend }; |
Loading…
Reference in new issue