wl

Unnamed repository; edit this file 'description' to name the repository.
git clone https://logand.com/git/wl.git/
Log | Files | Refs | LICENSE

commit d68eb42502f07b3002cdad0f4f40adb9ec797687
parent 4b48fcb455bd30954d9e801d78ec2058fb31d4e3
Author: tomas <tomas@logand.com>
Date:   Sat, 12 Sep 2009 11:59:10 +0200

all in one wl object

Diffstat:
Mindex.org | 6++++--
Mwl.js | 618+++++++++++++++++++++++++++++++++++++++----------------------------------------
2 files changed, 310 insertions(+), 314 deletions(-)

diff --git a/index.org b/index.org @@ -31,8 +31,10 @@ function $$(Id) {return $(Id).textContent;} </p> <script> function sandbox() { - alert(str((new wlR).parse("one \"hi \\\"George\\\" go\" (12 3 (a . b) . 456) 7.8"))); - alert(str((new wlR).parse("(. (1 . 2))"))); + var l = new wl; + alert(l.str(l.parse("one \"hi \\\"George\\\" go\" (12 3 (a b) 456) 7.8"))); + alert(l.str(l.parse("one \"hi \\\"George\\\" go\" (12 3 (a . b) . 456) 7.8"))); + alert(l.str(l.parse("(. (1 . 2))"))); } </script> <button onclick="javascript:sandbox();">Run</button> code from sandbox. diff --git a/wl.js b/wl.js @@ -1,34 +1,37 @@ // wl.js -- (c) 2009 Tomas Hlavaty -function Cons(Car, Cdr) { - this.car = Car; - this.cdr = Cdr; - return this; -} -function isCons(X) {return X && X.constructor === Cons;} -function cons(Car, Cdr) {return new Cons(Car, Cdr);} +function wl() { + var Me = this; -function Sym(Nm, Val, Prop) { - this.nm = Nm; - this.car = Prop; - this.cdr = Val; - return this; -} -function isSym(X) {return X && X.constructor === Sym;} -function sym(X) {return X.nm;} + function Cons(Car, Cdr) { + this.car = Car; + this.cdr = Cdr; + return this; + } + function isCons(X) {return X && X.constructor === Cons;} + function cons(Car, Cdr) {return new Cons(Car, Cdr);} + + function Sym(Nm, Val, Prop) { + this.nm = Nm; + this.car = Prop; + this.cdr = Val; + return this; + } + function isSym(X) {return X && X.constructor === Sym;} + function sym(X) {return X.nm;} -function car(X) {return X.car;} -function cdr(X) {return X.cdr;} + function car(X) {return X.car;} + function cdr(X) {return X.cdr;} -var NIL = new Sym("NIL"); -NIL.car = NIL; -NIL.cdr = NIL; + var NIL = new Sym("NIL"); + NIL.car = NIL; + NIL.cdr = NIL; -function wlT() { // tokenizer - var Me = this; - Me.Qte = {}; - Me.Lp = {}; - Me.Rp = {}; + var Qte = {}; + var Lp = {}; + var Rp = {}; + + // reader function init(L) { Me.L = L; Me.N = L.length; @@ -91,33 +94,23 @@ function wlT() { // tokenizer case false: return undefined; case "#": return comment(); case '"': xchar(); return text(); - case "'": xchar(); return Me.Qte; - case "(": xchar(); Me.D++; return Me.Lp; - case ")": xchar(); Me.D--; return Me.Rp; + case "'": xchar(); return Qte; + case "(": xchar(); Me.D++; return Lp; + case ")": xchar(); Me.D--; return Rp; default: return symbol(); } } - wlT.prototype.init = init; - wlT.prototype.peek = peek; - wlT.prototype.token = token; - return this; -} -function wlR(Sd) { // reader - var Me = this; - Me.Tk = new wlT; - function init(L) { - Me.Tk.init(L); - } + // parser function parse(L) { - Me.Tk.init(L); - var Os = [Me.Tk.Lp]; + init(L); + var Os = [Lp]; function build() { var Z = NIL; var Dot; while(0 < Os.length) { var X = Os.pop(); - if(Me.Tk.Lp === X) return Dot ? cons(Dot, cons(Z, NIL)) : Z; + if(Lp === X) return Dot ? cons(Dot, cons(Z, NIL)) : Z; Dot = false; if(isSym(X) && "." == sym(X)) { if(NIL === cdr(Z)) { @@ -128,10 +121,10 @@ function wlR(Sd) { // reader } throw "Missing mark"; } - while(Me.Tk.peek()) { - var X = Me.Tk.token(); + while(peek()) { + var X = token(); if(X) { - if(Me.Tk.Rp === X) Os.push(build()); + if(Rp === X) Os.push(build()); else Os.push(X); } } @@ -139,195 +132,196 @@ function wlR(Sd) { // reader if(0 < Os.length) throw "Incomplete input, left with " + Os; return Z; } - wlR.prototype.init = init; - wlR.prototype.parse = parse; - return this; -} -function str(L) { // printer - var A = []; - if(typeof L == "number") A.push(L); - else if(isSym(L)) A.push(sym(L)); - else if(isCons(L)) { - A.push("("); - while(isCons(L)) { - A.push(str(car(L))); - L = cdr(L); - if(NIL !== L) A.push(" "); - } - if(NIL !== L) { - A.push(". "); - A.push(str(L)); - } - A.push(")"); - } else { - var Y = L.split(""); - for(var I = 0; I < Y.length; I++) { - if(Y[I] == "\\") Y[I] = "\\\\"; - else if(Y[I] == '"') Y[I] = '\\"'; + // printer + function str(L) { + var A = []; + if(typeof L == "number") A.push(L); + else if(isSym(L)) A.push(sym(L)); + else if(isCons(L)) { + A.push("("); + while(isCons(L)) { + A.push(str(car(L))); + L = cdr(L); + if(NIL !== L) A.push(" "); + } + if(NIL !== L) { + A.push(". "); + A.push(str(L)); + } + A.push(")"); + } else { + var Y = L.split(""); + for(var I = 0; I < Y.length; I++) { + if(Y[I] == "\\") Y[I] = "\\\\"; + else if(Y[I] == '"') Y[I] = '\\"'; + } + var S = Y.join(""); + //var S = L.replace(/\"/g, "\\\"").replace(/\\/g, "\\\\"); + A.push('"' + S + '"'); } - var S = Y.join(""); - //var S = L.replace(/\"/g, "\\\"").replace(/\\/g, "\\\\"); - A.push('"' + S + '"'); + return A.join(""); } - return A.join(""); -} + wl.prototype.parse = parse; + wl.prototype.str = str; + return this; +} -function wl() { - var Sd = {}; - var Rd = new wlR; - - Sd["car"] = function car(E) {return E.car;}; - Sd["cdr"] = function cdr(E) {return E.cdr;}; - Sd["cons"] = function cons(E) {return Rd.cons(E.car, E.cdr);}; - Sd["reverse"] = function reverse(E) { - var Z = NIL; - while(!isNil(E)) { - Z = cons(E.car, Z); - E = E.cdr; - } - return Z; - }; - Sd["member"] = function member(E) { - var F = E.car; - var R = E.cdr; - while(!isNil(R)) { - if(!isNil(eq(F, R.car))) return R; - R = R.cdr; - } - return NIL; - }; - // Sd["caar"] = function caar(E) {return car(car(E));}; - // Sd["cadr"] = function cadr(E) {return car(cdr(E));}; - // Sd["cdar"] = function cdar(E) {return cdr(car(E));}; - // Sd["cddr"] = function cddr(E) {return cdr(cdr(E));}; - // Sd["caddr"] = function caddr(E) {return car(cdr(cdr(E)));}; - // Sd["cdddr"] = function cdddr(E) {return cdr(cdr(cdr(E)));}; - // Sd["cadddr"] = function cadddr(E) {return car(cdr(cdr(cdr(E))));}; - // Sd["cddddr"] = function cddddr(E) {return cdr(cdr(cdr(cdr(E))));}; - - Sd["-"] = function(E) {var X = Os.pop(); Os.push(Os.pop() - X);}; - Sd["*"] = function(E) {Os.push(Os.pop() * Os.pop());}; - Sd["/"] = function(E) {var X = Os.pop(); Os.push(Os.pop() / X);}; - Sd["%"] = function(E) {var X = Os.pop(); Os.push(Os.pop() % X);}; - - Sd["eq"] = function() {var Y = Os.pop(); var X = Os.pop(); Os.push(X == Y);}; - Sd["lt"] = function() {var Y = Os.pop(); var X = Os.pop(); Os.push(X < Y);}; - - Sd["if"] = function() { - var N = Os.pop(); - var P = Os.pop(); - var C = Os.pop(); - Es.push([false, C === true ? P : N]); - }; - - // Sd[".call"] = function() { - // var N = Os.pop(); - // var K = Os.pop(); - // var D = Os.pop(); - // var X = []; - // for(var I = 0; I < N; I++) X.unshift(Os.pop()); - // Os.push(D[K].apply(D, X)); - // }; - Sd[".math"] = function(E) {return Math;}; - Sd[".date"] = function(E) {return new Date();}; // TODO split new and Date - Sd[".window"] = function(E) {return window;}; - // Sd[".callback"] = function() { // TODO event arg? - // var X = Os.pop(); - // Os.push(function() { - // Ps.run(X, true); - // while(0 < Es.length) - // Ps.step(); - // }); - // }; - - - Sd["list2array"] = function list2array(E) { - var Z = []; - while(!isNil(E)) { - Z.push(E.car); - E = E.cdr; - } - return Z; - }; - // Sd["array2list"] = function array2list(A) { - // var Z = NIL; - // for(var I = A.length - 1; 0 <= I; I--) - // Z = cons(A[I], Z); - // return Z; - // }; - // Sd["object2list"] = function object2list(O) { - // var Z = NIL; - // for(var I in O) - // Z = cons(cons(I, O[I]), Z); - // return Z; - // }; - - function parse() { - var Z; - var A = arguments; - if(A.length) - for(var I = 0; I < A.length; I++) - Z = Rd.parse(A[I]); - else Z = Rd.parse(A); - return Z; - } - wl.prototype.parse = parse; - return this; -} +// function wl() { +// var Sd = {}; +// var Rd = new wlR; + +// Sd["car"] = function car(E) {return E.car;}; +// Sd["cdr"] = function cdr(E) {return E.cdr;}; +// Sd["cons"] = function cons(E) {return Rd.cons(E.car, E.cdr);}; +// Sd["reverse"] = function reverse(E) { +// var Z = NIL; +// while(!isNil(E)) { +// Z = cons(E.car, Z); +// E = E.cdr; +// } +// return Z; +// }; +// Sd["member"] = function member(E) { +// var F = E.car; +// var R = E.cdr; +// while(!isNil(R)) { +// if(!isNil(eq(F, R.car))) return R; +// R = R.cdr; +// } +// return NIL; +// }; +// // Sd["caar"] = function caar(E) {return car(car(E));}; +// // Sd["cadr"] = function cadr(E) {return car(cdr(E));}; +// // Sd["cdar"] = function cdar(E) {return cdr(car(E));}; +// // Sd["cddr"] = function cddr(E) {return cdr(cdr(E));}; +// // Sd["caddr"] = function caddr(E) {return car(cdr(cdr(E)));}; +// // Sd["cdddr"] = function cdddr(E) {return cdr(cdr(cdr(E)));}; +// // Sd["cadddr"] = function cadddr(E) {return car(cdr(cdr(cdr(E))));}; +// // Sd["cddddr"] = function cddddr(E) {return cdr(cdr(cdr(cdr(E))));}; + +// Sd["-"] = function(E) {var X = Os.pop(); Os.push(Os.pop() - X);}; +// Sd["*"] = function(E) {Os.push(Os.pop() * Os.pop());}; +// Sd["/"] = function(E) {var X = Os.pop(); Os.push(Os.pop() / X);}; +// Sd["%"] = function(E) {var X = Os.pop(); Os.push(Os.pop() % X);}; + +// Sd["eq"] = function() {var Y = Os.pop(); var X = Os.pop(); Os.push(X == Y);}; +// Sd["lt"] = function() {var Y = Os.pop(); var X = Os.pop(); Os.push(X < Y);}; + +// Sd["if"] = function() { +// var N = Os.pop(); +// var P = Os.pop(); +// var C = Os.pop(); +// Es.push([false, C === true ? P : N]); +// }; + +// // Sd[".call"] = function() { +// // var N = Os.pop(); +// // var K = Os.pop(); +// // var D = Os.pop(); +// // var X = []; +// // for(var I = 0; I < N; I++) X.unshift(Os.pop()); +// // Os.push(D[K].apply(D, X)); +// // }; +// Sd[".math"] = function(E) {return Math;}; +// Sd[".date"] = function(E) {return new Date();}; // TODO split new and Date +// Sd[".window"] = function(E) {return window;}; +// // Sd[".callback"] = function() { // TODO event arg? +// // var X = Os.pop(); +// // Os.push(function() { +// // Ps.run(X, true); +// // while(0 < Es.length) +// // Ps.step(); +// // }); +// // }; + + +// Sd["list2array"] = function list2array(E) { +// var Z = []; +// while(!isNil(E)) { +// Z.push(E.car); +// E = E.cdr; +// } +// return Z; +// }; +// // Sd["array2list"] = function array2list(A) { +// // var Z = NIL; +// // for(var I = A.length - 1; 0 <= I; I--) +// // Z = cons(A[I], Z); +// // return Z; +// // }; +// // Sd["object2list"] = function object2list(O) { +// // var Z = NIL; +// // for(var I in O) +// // Z = cons(cons(I, O[I]), Z); +// // return Z; +// // }; + +// function parse() { +// var Z; +// var A = arguments; +// if(A.length) +// for(var I = 0; I < A.length; I++) +// Z = Rd.parse(A[I]); +// else Z = Rd.parse(A); +// return Z; +// } +// wl.prototype.parse = parse; +// return this; +// } -/// lisp +// /// lisp -// function format(N, S) { -// var X = "" + N; -// var L = X.length; -// return X.slice(0, L - S) + "." + X.slice(L - S, L); -// } +// // function format(N, S) { +// // var X = "" + N; +// // var L = X.length; +// // return X.slice(0, L - S) + "." + X.slice(L - S, L); +// // } -// function real(N, S) { -// return N / Math.pow(10, S); -// } +// // function real(N, S) { +// // return N / Math.pow(10, S); +// // } -var Syms = {}; +// var Syms = {}; -function mkSym(Nm, Val, Prop) { - var X = new Sym(Nm, Val, Prop); - Syms[Nm] = X; - return X; -} +// function mkSym(Nm, Val, Prop) { +// var X = new Sym(Nm, Val, Prop); +// Syms[Nm] = X; +// return X; +// } -function xget(Sym) { - return isSym(Sym) ? Sym._val : Sym; -} +// function xget(Sym) { +// return isSym(Sym) ? Sym._val : Sym; +// } -function xset(Sym, Val) { - if(!isSym(Sym)) throw "Sym expected"; - Sym._val = Val; - return Sym._val; -} +// function xset(Sym, Val) { +// if(!isSym(Sym)) throw "Sym expected"; +// Sym._val = Val; +// return Sym._val; +// } -//var NIL = mkSym("NIL"); -var T = mkSym("T"); +// //var NIL = mkSym("NIL"); +// var T = mkSym("T"); -//xset(NIL, NIL); -xset(T, T); -// TODO set props for NIL and T +// //xset(NIL, NIL); +// xset(T, T); +// // TODO set props for NIL and T -function intern(Sym) { - //if(!(Sym in Syms)) Syms[Sym] = mkSym(Sym, NIL, NIL); - return Syms[Sym] || (Syms[Sym] = mkSym(Sym, NIL, NIL)); -} +// function intern(Sym) { +// //if(!(Sym in Syms)) Syms[Sym] = mkSym(Sym, NIL, NIL); +// return Syms[Sym] || (Syms[Sym] = mkSym(Sym, NIL, NIL)); +// } -function isT(X) { - return X === T; -} +// function isT(X) { +// return X === T; +// } @@ -336,117 +330,117 @@ function isT(X) { -function eq(X, Y) { - if(X === Y) return T; - //if(X == Y) return T; - return NIL; -} +// function eq(X, Y) { +// if(X === Y) return T; +// //if(X == Y) return T; +// return NIL; +// } -function xdelete(A, L) { - var X = NIL; - while(!isNil(L)) { - if(isNil(eq(A, L.car))) X = cons(L.car, X); - L = L.cdr; - } - return reverse(X); -} +// function xdelete(A, L) { +// var X = NIL; +// while(!isNil(L)) { +// if(isNil(eq(A, L.car))) X = cons(L.car, X); +// L = L.cdr; +// } +// return reverse(X); +// } -function lsApply(Fn, Args) { -} +// function lsApply(Fn, Args) { +// } -function jsFn(Fn) { - var F = function() { - return lsApply(Fn, list2array(arguments)); - }; - return F; -} +// function jsFn(Fn) { +// var F = function() { +// return lsApply(Fn, list2array(arguments)); +// }; +// return F; +// } -function jsApply() { - var Fn = arguments.shift(); - var Args = arguments.shift(); - var Rest = arguments; - return Fn.apply(list2array(Args).unshift.apply(list2array(Rest))); -} +// function jsApply() { +// var Fn = arguments.shift(); +// var Args = arguments.shift(); +// var Rest = arguments; +// return Fn.apply(list2array(Args).unshift.apply(list2array(Rest))); +// } -var Xeval = {}; +// var Xeval = {}; -function xdef(Nm, Fn) { - if(!(Nm in Syms)) intern(Nm); - Xeval[Nm] = Fn; -} +// function xdef(Nm, Fn) { +// if(!(Nm in Syms)) intern(Nm); +// Xeval[Nm] = Fn; +// } -xdef("quote", function(E) { - return cdr(E); // or cdr? - }); -xdef("if", function(E) { - if(!isNil(xeval(cadr(E)))) return xeval(caddr(E)); - else return xeval(cadddr(E)); - }); -xdef("prog", function(E) { - var L = cdr(E); - var X = NIL; - while(!isNil(L)) { - X = xeval(L.car); - L = L.cdr; - } - return X; - }); - -function xeval(E) { - if(isSym(E)) return xget(E); - else if(!isCons(E)) return E; - else if(car(E)._nm in Xeval) return Xeval[car(E)._nm](E); - else return xapply(xeval(car(E)), map(xeval, cdr(E))); -} +// xdef("quote", function(E) { +// return cdr(E); // or cdr? +// }); +// xdef("if", function(E) { +// if(!isNil(xeval(cadr(E)))) return xeval(caddr(E)); +// else return xeval(cadddr(E)); +// }); +// xdef("prog", function(E) { +// var L = cdr(E); +// var X = NIL; +// while(!isNil(L)) { +// X = xeval(L.car); +// L = L.cdr; +// } +// return X; +// }); + +// function xeval(E) { +// if(isSym(E)) return xget(E); +// else if(!isCons(E)) return E; +// else if(car(E)._nm in Xeval) return Xeval[car(E)._nm](E); +// else return xapply(xeval(car(E)), map(xeval, cdr(E))); +// } -function initLisp() { - //xalert(xeval(NIL), xeval(T), xeval(12), xeval(12.3), xeval({x: "hi"}), xeval([1, 2])); - //xalert(xeval(cons(intern("quote"), cons("whoa", NIL)))); - //xalert(xeval(cons(intern("quote"), cons("whoa", cons("b", NIL))))); - //xalert(intern("if")); - //xalert(object2list(Syms)); - //xalert(object2list(Xeval)); - //xalert(xeval(cons(intern("if"), cons(T, cons("yes", cons("no", NIL)))))); - //xalert(xeval(cons(intern("if"), cons(NIL, cons("yes", cons("no", NIL)))))); - //xalert(xeval(cons(intern("quote"), intern("whoa")))); -} +// function initLisp() { +// //xalert(xeval(NIL), xeval(T), xeval(12), xeval(12.3), xeval({x: "hi"}), xeval([1, 2])); +// //xalert(xeval(cons(intern("quote"), cons("whoa", NIL)))); +// //xalert(xeval(cons(intern("quote"), cons("whoa", cons("b", NIL))))); +// //xalert(intern("if")); +// //xalert(object2list(Syms)); +// //xalert(object2list(Xeval)); +// //xalert(xeval(cons(intern("if"), cons(T, cons("yes", cons("no", NIL)))))); +// //xalert(xeval(cons(intern("if"), cons(NIL, cons("yes", cons("no", NIL)))))); +// //xalert(xeval(cons(intern("quote"), intern("whoa")))); +// } -// parser +// // parser -function isArray(A) { - return A && A.constructor == Array; -} +// function isArray(A) { +// return A && A.constructor == Array; +// } -function flatten(A) { - var X = []; - function rec(B) { - var N = B.length; - var I; - for(I = 0; I < N; I++) { - if(isArray(B[I])) rec(B[I]); - else X.push(B[I]); - } - } - rec(A); - return X; -} +// function flatten(A) { +// var X = []; +// function rec(B) { +// var N = B.length; +// var I; +// for(I = 0; I < N; I++) { +// if(isArray(B[I])) rec(B[I]); +// else X.push(B[I]); +// } +// } +// rec(A); +// return X; +// } -function lisp2string(Any) { - return flatten(unparse(Any)).join(""); -} +// function lisp2string(Any) { +// return flatten(unparse(Any)).join(""); +// } -function xalert() { - var X = []; - var N = arguments.length; - var I; - for(I = 0; I < N; I++) { - X.push(flatten(unparse(arguments[I])).join("")); - } - alert(X.join(" ")); -} +// function xalert() { +// var X = []; +// var N = arguments.length; +// var I; +// for(I = 0; I < N; I++) { +// X.push(flatten(unparse(arguments[I])).join("")); +// } +// alert(X.join(" ")); +// } -function xmsg(A) { - var B = parse(A); - var X = flatten(unparse(B)).join(""); - mk(w("test"), "pre", {}, {}, "'" + A + "' => " + X); -} +// function xmsg(A) { +// var B = parse(A); +// var X = flatten(unparse(B)).join(""); +// mk(w("test"), "pre", {}, {}, "'" + A + "' => " + X); +// }