@ -1,3 +1,6 @@
var errors = require ( "./errors.js" ) ;
var _ = require ( "underscore" ) ;
var Expression = {
display :
function ( ) {
@ -6,18 +9,24 @@ var Expression = {
type :
function ( ) {
return this . exprType ;
} ,
unify :
}
} ;
var TypeExpression = {
unify :
function ( t ) {
if ( this . exprType === t . exprType ) {
return t . exprType ;
if ( this . expr === t . expr ) {
return t . expr ;
}
else {
console . log ( "Could not unify " + this . exprType + " with " + t . exprType ) ;
console . log ( "Could not unify " + this . expr + " with " + t . expr ) ;
}
}
} ,
isTypeExpr : true
} ;
var isTypeExpr = _ . property ( "isTypeExpr" ) ;
function Closure ( bound_vars , free_vars , body , env ) {
this . bound_vars = bound_vars ;
this . free_vars = free_vars ;
@ -163,17 +172,37 @@ function If(condition, thenexp, elseexp) {
}
function TypeVar ( name ) {
this . exprtype = "TypeVar" ;
this . name = name ;
return this ;
}
TypeVar . prototype = TypeExpression ;
function TypeOp ( name , params , body ) {
if ( ! _ . every ( params , _ . compose (
_ . partial ( _ . isEqual , "TypeVar" ) ,
_ . property ( "exprtype" ) ) ) ) {
throw errors . JInternalError (
"Parameters to a type operator must be type variables"
) ;
}
this . name = name ;
this . params = params ;
this . body = body ;
return this ;
}
TypeOp . prototype = TypeExpression ;
function TypeBinding ( expression , type ) {
this . expr = expression ;
this . type = type ;
return this ;
}
TypeBinding . prototype = TypeExpression ;
//Applies the function ``name'' to the list of parameters
function makeApp ( name , parameters ) {
if ( parameters ) {
@ -184,7 +213,6 @@ function makeApp(name, parameters) {
else {
return new App ( name ) ;
}
}
function makeGensym ( ) {
@ -221,25 +249,27 @@ OPInfo = {"+" : [3, "Left"],
"," : [ 1 , "Left" ] } ;
module . exports =
{ IntT : IntT ,
FloatT : FloatT ,
StrT : StrT ,
BoolT : BoolT ,
ListT : ListT ,
FuncT : FuncT ,
App : App ,
Name : Name ,
Def : Def ,
OpT : OpT ,
OPInfo : OPInfo ,
makeApp : makeApp ,
If : If ,
DefFunc : DefFunc ,
UnaryOp : UnaryOp ,
Nil : Nil ,
LetExp : LetExp ,
gensym : gensym ,
TypeVar : TypeVar ,
TypeOp : TypeOp ,
Closure : Closure
{
IntT : IntT ,
FloatT : FloatT ,
StrT : StrT ,
BoolT : BoolT ,
ListT : ListT ,
FuncT : FuncT ,
App : App ,
Name : Name ,
Def : Def ,
OpT : OpT ,
OPInfo : OPInfo ,
makeApp : makeApp ,
If : If ,
DefFunc : DefFunc ,
UnaryOp : UnaryOp ,
Nil : Nil ,
LetExp : LetExp ,
gensym : gensym ,
TypeVar : TypeVar ,
TypeOp : TypeOp ,
TypeBinding : TypeBinding ,
Closure : Closure
} ;