Skip to content

Commit

Permalink
new expander: Remove old expander
Browse files Browse the repository at this point in the history
  • Loading branch information
yhara committed Mar 22, 2017
1 parent 93b6575 commit 80335db
Showing 1 changed file with 0 additions and 93 deletions.
93 changes: 0 additions & 93 deletions src/system/interpreter.js
Expand Up @@ -484,96 +484,3 @@ BiwaScheme.Interpreter.read = function(str){
var r = parser.getObject();
return (r == BiwaScheme.Parser.EOS)? BiwaScheme.eof: r;
};

// Expand macro calls in a expression recursively.
//
// x - expression
// flag - used internally. do not specify this
//
// @throws {BiwaScheme.Error} when x has syntax error
BiwaScheme.Interpreter.expand = function(x, flag/*optional*/){
var expand = BiwaScheme.Interpreter.expand;
flag || (flag = {})
var ret = null;

if(x instanceof BiwaScheme.Pair){
switch(x.car){
case BiwaScheme.Sym("define"):
var left = x.cdr.car, exp = x.cdr.cdr;
ret = new BiwaScheme.Pair(BiwaScheme.Sym("define"),
new BiwaScheme.Pair(left, expand(exp, flag)));
break;
case BiwaScheme.Sym("begin"):
ret = new BiwaScheme.Pair(BiwaScheme.Sym("begin"), expand(x.cdr, flag));
break;
case BiwaScheme.Sym("quote"):
ret = x;
break;
case BiwaScheme.Sym("lambda"):
var vars=x.cdr.car, body=x.cdr.cdr;
ret = new BiwaScheme.Pair(BiwaScheme.Sym("lambda"),
new BiwaScheme.Pair(vars, expand(body, flag)));
break;
case BiwaScheme.Sym("if"):
var testc=x.second(), thenc=x.third(), elsec=x.fourth();
ret = BiwaScheme.List(BiwaScheme.Sym("if"),
expand(testc, flag),
expand(thenc, flag),
expand(elsec, flag));
break;
case BiwaScheme.Sym("set!"):
var v=x.second(), x=x.third();
ret = BiwaScheme.List(BiwaScheme.Sym("set!"), v, expand(x, flag));
break;
case BiwaScheme.Sym("call-with-current-continuation"):
case BiwaScheme.Sym("call/cc"):
var x=x.second();
ret = BiwaScheme.List(BiwaScheme.Sym("call/cc"), expand(x, flag));
break;
default: //apply
var transformer = null;
if(BiwaScheme.isSymbol(x.car)){
if(BiwaScheme.TopEnv[x.car.name] instanceof BiwaScheme.Syntax)
transformer = BiwaScheme.TopEnv[x.car.name];
else if(BiwaScheme.CoreEnv[x.car.name] instanceof BiwaScheme.Syntax)
transformer = BiwaScheme.CoreEnv[x.car.name];
}

if(transformer){
flag["modified"] = true;
ret = transformer.transform(x);

// // Debug
// var before = BiwaScheme.to_write(x);
// var after = BiwaScheme.to_write(ret);
// if(before != after){
// console.log("before: " + before)
// console.log("expand: " + after)
// }

var fl;
for(;;){
ret = expand(ret, fl={});
if(!fl["modified"])
break;
}
}
else{
var expanded_car = expand(x.car, flag);
var expanded_cdr;
if(!(x.cdr instanceof BiwaScheme.Pair) && (x.cdr !== BiwaScheme.nil)){
throw new Error("proper list required for function application "+
"or macro use: "+BiwaScheme.to_write(x));
}
expanded_cdr = BiwaScheme.array_to_list(
_.map(x.cdr.to_array(),
function(item){ return expand(item, flag); }));
ret = new BiwaScheme.Pair(expanded_car, expanded_cdr);
}
}
}
else{
ret = x;
}
return ret;
};

0 comments on commit 80335db

Please sign in to comment.