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