Skip to content

Commit

Permalink
"fixed string escapement, added list functions"
Browse files Browse the repository at this point in the history
  • Loading branch information
peterolson committed Mar 6, 2012
1 parent 22369ee commit 579afc3
Show file tree
Hide file tree
Showing 2 changed files with 241 additions and 10 deletions.
40 changes: 39 additions & 1 deletion compiler.js
@@ -1,3 +1,41 @@
if (!String.prototype.quote) {
String.prototype.quote = function () {
var c, i, l = this.length, o = '"';
for (i = 0; i < l; i += 1) {
c = this.charAt(i);
if (c >= ' ') {
if (c === '\\' || c === '"') {
o += '\\';
}
o += c;
} else {
switch (c) {
case '\b':
o += '\\b';
break;
case '\f':
o += '\\f';
break;
case '\n':
o += '\\n';
break;
case '\r':
o += '\\r';
break;
case '\t':
o += '\\t';
break;
default:
c = c.charCodeAt();
o += '\\u00' + Math.floor(c / 16).toString(16) +
(c % 16).toString(16);
}
}
}
return o + '"';
};
}

var compile = function (expressions, language, scope) {
var counter = -1, fCounter = -1;
return (function compile(expressions, language, scope) {
Expand All @@ -15,7 +53,7 @@ var compile = function (expressions, language, scope) {
empty: function () { return ""; },
statement: function (stmt) { return stmt + ";"; },
identifier: function (name) { return "n(" + name + ")"; },
string: function (value) { return '"' + value.replace(/"/g, '\\\"') + '"'; },
string: function (value) { return value.quote(); },
number: function (number) { return number.toString(); },
parenthetic: function (expr) { return "(" + expr + ")"; },
argName: function (n) { return "$" + n; },
Expand Down
211 changes: 202 additions & 9 deletions lib.js
Expand Up @@ -2,7 +2,8 @@ var lib = (function () {
var serialize = function(obj) {
var convertFunction = function (fn) {
if(typeof fn === "function") return function (args) {
return convertFunction(fn.apply(null, args.map(function(arg){ return arg instanceof Array ? arg : arg.value; })));
var a = args.map(function(arg){ return arg instanceof Array ? arg : arg.value; });
return convertFunction(fn.apply(null, a));
};
return fn;
};
Expand All @@ -22,15 +23,34 @@ var lib = (function () {
}
return obj;
};

var checkFunction = function(fn) {
if(typeof fn !== "function") throw "Expected function argument";
};

var type = function(a) {
if(a instanceof Array) return "array";
if(typeof a === "undefined" || a === null) return "nil";
return typeof a;
};

var library = {
"true": true,
"false": false,
"nil": null,
type: function (a) {
return type(a);
},
alert: function (msg) {
alert(msg);
return msg;
},
prompt: function (msg, defaultText) {
return prompt(msg, defaultText);
},
error: function(err) {
throw err;
},
array: {
head: function(arr) {
return arr[0];
Expand All @@ -41,9 +61,124 @@ var lib = (function () {
foot: function(arr) {
return arr[arr.length - 1];
},
body: function(arr) {
return arr.slice(0, -1);
},
random: function(arr) {
return arr[(Math.random() * arr.length) | 0];
},
length: function(arr) {
return arr.length;
},
prepend: function(arr) {
return function(value, v2) {
if(typeof v2 !== "undefined") {
value = [value];
for(var i = 1; i < arguments.length; i++) {
value.push(arguments[i]);
}
}
return [].concat(value, arr);
};
},
append: function(arr) {
return function(value, v2) {
if(typeof v2 !== "undefined") {
value = [value];
for(var i = 1; i < arguments.length; i++) {
value.push(arguments[i]);
}
}
return arr.concat(value);
};
},
concat: function(arr) {
return function(arr2) {
if(!(arr2 instanceof Array)) throw "Expected array argument";
return arr.concat(arr2);
};
},
range: function(arr) {
return function(start, end) {
if(!(start in arr) || !(end in arr)) throw "Index not in array";
return arr.slice(start, end);
};
},
remove: function(arr) {
return function(start, end) {
end = end || start;
if(!(start in arr) || !(end in arr)) throw "Index not in array";
end++;
return arr.slice(0, start).concat(arr.slice(end));
};
},
insert: function(arr) {
return function(index, elems) {
if(!(index in arr)) throw "Index not in array";
if(!(elems instanceof Array)) throw "Expected array argument";
return arr.slice(0, index).concat(elems, arr.slice(index));
};
},
join: function(arr) {
return function(separator) {
if(typeof separator !== "string") throw "Expected string argument.";
return arr.split(separator);
};
},
reverse: function(arr) {
var ret = [];
for(var i = arr.length - 1; i >= 0; i--) {
ret.push(arr[i]);
}
return ret;
},
sort: function(arr) {
return function(fn) {
if(typeof fn !== "function") fn = function(a, b) {
var aT = type(a), bT = type(b);
if(aT !== bT) {
return parseInt(aT, 36) - parseInt(bT, 36);
}
if(a > b) return 1;
if(a < b) return -1;
return 0;
};
return arr.slice().sort(fn);
};
},
indexOf: function(arr) {
return function(value) {
for(var i = 0; i < arr.length; i++) {
if(q(arr[i], value)) return i;
}
return -1;
};
},
lastIndexOf: function(arr) {
return function(value) {
for(var i = arr.length - 1; i >= 0; i--) {
if(q(arr[i], value)) return i;
}
return -1;
};
},
contains: function(arr) {
return function(value) {
for(var i = 0; i < arr.length; i++) {
if(q(arr[i], value)) return true;
}
return false;
};
},
forEach: function(arr) {
return function(fn) {
checkFunction(fn);
for(var i in arr) {
if(!arr.hasOwnProperty(i)) continue;
f(fn, [arr[i]]);
}
};
},
fill: function(arr) {
var ret = [], i;
for(i = 1; i < arr.length; i++) {
Expand All @@ -57,18 +192,76 @@ var lib = (function () {
ret.push(arr[arr.length - 1]);
return ret;
},
reduce: function(arr) {
filter: function(arr) {
return function(fn) {
if(!arr.length) throw "Cannot reduce empty array.";
var start = true, accum;
checkFunction(fn);
var ret = [];
for(var i in arr) {
if(!arr.hasOwnProperty(i)) continue;
if(start) {
start = false;
accum = arr[i];
continue;
}
if(f(fn, [arr[i], i, arr]) === true) ret.push(arr[i]);
}
return ret;
};
},
every: function(arr) {
return function(fn) {
checkFunction(fn);
for(var i in arr) {
if(!arr.hasOwnProperty(i)) continue;
if(f(fn, [arr[i], i, arr]) !== true) return false;
}
return true;
};
},
some: function(arr) {
return function(fn) {
checkFunction(fn);
for(var i in arr) {
if(!arr.hasOwnProperty(i)) continue;
if(f(fn, [arr[i], i, arr]) === true) return true;
}
return false;
};
},
map: function(arr){
return function(fn) {
checkFunction(fn);
var ret = [];
for (var i in arr) {
if(!arr.hasOwnProperty(i)) continue;
ret[i] = f(fn, [arr[i], i, arr]);
}
return ret;
};
},
fold: function(arr) {
return function(fn, seed) {
var accum, i;
if(typeof seed === "undefined") {
if(!arr.length) throw "Cannot reduce empty array.";
accum = arr[0]; i = 1;
} else {
accum = seed; i = 0;
}
while(i < arr.length) {
accum = f(fn, [accum, arr[i], i, arr]);
i++;
}
return accum;
};
},
foldBack: function(arr) {
return function(fn, seed) {
var accum, i;
if(typeof seed === "undefined") {
if(!arr.length) throw "Cannot reduce empty array.";
accum = arr[arr.length - 1]; i = arr.length - 2;
} else {
accum = seed; i = arr.length - 1;
}
while(i >= 0) {
accum = f(fn, [accum, arr[i], i, arr]);
i--;
}
return accum;
};
Expand Down

0 comments on commit 579afc3

Please sign in to comment.