commit 0b5c78aec29fc0e25a6aa649f48185d82e82b02d
parent e3df5b0a036703aeebe2dee333d92f4c2bc249bb
Author: tomas <tomas@logand.com>
Date: Sun, 24 Jan 2010 21:12:32 +0100
custom Symbol.prototype.toString to work with assoc arrays
Diffstat:
M | wps.js | | | 201 | ++++++++++++++++++++++++++++++++++++++----------------------------------------- |
1 file changed, 96 insertions(+), 105 deletions(-)
diff --git a/wps.js b/wps.js
@@ -7,18 +7,10 @@ function isQuoted(V) {return V.D16322F5;}
function quote(V) {V.D16322F5 = true; return V;}
function unquote(V) {delete V.D16322F5; return V;}
-function Symbol(N) {
- this.nm = N;
- return this;
-}
-
-function isSymbol(V) {
- return V && V.constructor === Symbol;
-}
-
-function symbolName(V) {
- return V.nm;
-}
+function Symbol(N) {this.nm = N; return this;}
+function isSymbol(V) {return V && V.constructor === Symbol;}
+function symbolName(V) {return V.nm;}
+Symbol.prototype.toString = function() {return "05E2710C" + symbolName(this);};
function isArray(V) {
return V && V.constructor === Array;
@@ -129,8 +121,7 @@ function PsParser(Ds) {
if("/" == peek()) {
xchar();
var X = symbol();
- //throw "Immediate literals not implemented yet " + X.nm;
- return inDs(Ds, symbolName(X));
+ return inDs(Ds, X);
} else {
var X = symbol();
return quote(X);
@@ -158,11 +149,10 @@ function PsParser(Ds) {
function Ps0(Os, Ds, Es) {
function run(X, Z) {
if(isSymbol(X) && !isQuoted(X)) { // executable name
- var K = symbolName(X);
- var D = inDs(Ds, K);
+ var D = inDs(Ds, X);
if(!D)
- throw "bind error '" + K + "'";
- Es.push([false, D[K]]);
+ throw "bind error '" + X + "'";
+ Es.push([false, D[X]]);
} else if(Z && isArray(X) && isQuoted(X)) { // proc from Es
if(0 < X.length) {
var F = X[0];
@@ -217,27 +207,29 @@ function Wps() {
var Es = [];
var Ps = new Ps0(Os, Ds, Es);
+ function def(Nm, Fn) {Sd[new Symbol(Nm)] = Fn;}
+
// trivial
- Sd["true"] = function() {Os.push(true);};
- Sd["false"] = function() {Os.push(false);};
- Sd["null"] = function() {Os.push(null);};
+ def("true", function() {Os.push(true);});
+ def("false", function() {Os.push(false);});
+ def("null", function() {Os.push(null);});
// math
- Sd["sub"] = function() {var X = Os.pop(); Os.push(Os.pop() - X);};
- Sd["mul"] = function() {Os.push(Os.pop() * Os.pop());};
- Sd["div"] = function() {var X = Os.pop(); Os.push(Os.pop() / X);};
- Sd["mod"] = function() {var X = Os.pop(); Os.push(Os.pop() % X);};
+ def("sub", function() {var X = Os.pop(); Os.push(Os.pop() - X);});
+ def("mul", function() {Os.push(Os.pop() * Os.pop());});
+ def("div", function() {var X = Os.pop(); Os.push(Os.pop() / X);});
+ def("mod", function() {var X = Os.pop(); Os.push(Os.pop() % X);});
// stack
var M = {};
- Sd["mark"] = function() {Os.push(M);};
- Sd["counttomark"] = function() {
+ def("mark", function() {Os.push(M);});
+ def("counttomark", function() {
var N = 0;
for(var I = Os.length - 1; 0 <= I; I--)
if(M === Os[I]) return Os.push(N);
else N++;
throw "Mark not found";
- };
- Sd["<<"] = Sd["mark"]; // TODO doc
- Sd[">>"] = function() { // TODO doc
+ });
+ def("<<", Sd[new Symbol("mark")]); // TODO doc
+ def(">>", function() { // TODO doc
var D = {};
while(0 < Os.length) {
var V = Os.pop();
@@ -245,19 +237,19 @@ function Wps() {
D[Os.pop()] = V;
}
throw "Mark not found";
- };
- Sd["exch"] = function() {
+ });
+ def("exch", function() {
var Y = Os.pop();
var X = Os.pop();
Os.push(Y);
Os.push(X);
- };
- Sd["clear"] = function() {Os.length = 0;};
- Sd["pop"] = function() {Os.pop();};
- Sd["index"] = function() {
+ });
+ def("clear", function() {Os.length = 0;});
+ def("pop", function() {Os.pop();});
+ def("index", function() {
Os.push(Os[Os.length - 2 - Os.pop()]);
- };
- Sd["roll"] = function() { // TODO in ps
+ });
+ def("roll", function() { // TODO in ps
var J = Os.pop();
var N = Os.pop();
var X = [];
@@ -267,8 +259,8 @@ function Wps() {
else Y.unshift(Os.pop());
for(I = 0; I < J; I++) Os.push(X.shift());
for(I = 0; I < N - J; I++) Os.push(Y.shift());
- };
- Sd["copy"] = function() {
+ });
+ def("copy", function() {
var N = Os.pop();
if(isObject(N)) {
var X = Os.pop();
@@ -280,34 +272,34 @@ function Wps() {
for(var I = 0; I < N; I++)
Os.push(Os[X + I]);
}
- };
+ });
// array
- Sd["length"] = function() {Os.push(Os.pop().length);};
- Sd["astore"] = function() {
+ def("length", function() {Os.push(Os.pop().length);});
+ def("astore", function() {
var A = Os.pop();
var N = A.length;
for(var I = N - 1; 0 <= I; I--)
A[I] = Os.pop();
Os.push(A);
- };
- Sd["array"] = function() {Os.push(new Array(Os.pop()));};
+ });
+ def("array", function() {Os.push(new Array(Os.pop()));});
// conditionals
- 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);};
+ def("eq", function() {var Y = Os.pop(); var X = Os.pop(); Os.push(X == Y);});
+ def("lt", function() {var Y = Os.pop(); var X = Os.pop(); Os.push(X < Y);});
// control
- Sd["ifelse"] = function() {
+ def("ifelse", function() {
var N = Os.pop();
var P = Os.pop();
var C = Os.pop();
Es.push([false, C === true ? P : N]);
- };
- Sd["repeat"] = function Xrepeat() { // TODO in ps
+ });
+ def("repeat", function Xrepeat() { // TODO in ps
var B = Os.pop();
var N = Os.pop();
if(1 < N) Es.push([true, N - 1, B, Xrepeat]);
if(0 < N) Es.push([false, B]);
- };
- Sd["for"] = function Xfor() { // TODO in ps
+ });
+ def("for", function Xfor() { // TODO in ps
var B = Os.pop();
var L = Os.pop();
var K = Os.pop();
@@ -319,52 +311,52 @@ function Wps() {
if(J + K <= L) Es.push([true, J + K, K, L, B, Xfor]);
if(J <= L) Es.push([false, J, B]);
}
- };
- Sd["exec"] = function() {Es.push([false, Os.pop()]);};
- Sd["cvx"] = function() {
+ });
+ def("exec", function() {Es.push([false, Os.pop()]);});
+ def("cvx", function() {
var X = Os.pop();
if(isSymbol(X) && isQuoted(X)) Os.push(unquote(X)); // executable name
else if(isArray(X) && !isQuoted(X)) Os.push(quote(X)); // proc
// TODO string -> parse
else Os.push(X);
- };
- Sd["cvlit"] = function() {
+ });
+ def("cvlit", function() {
var X = Os.pop();
if(isSymbol(X) && !isQuoted(X)) Os.push(quote(X)); // un-executable name
else if(isArray(X) && isQuoted(X)) Os.push(unquote(X)); // un-proc
// TODO reverse? string -> parse
else Os.push(X);
- };
+ });
// dictionary
- Sd["dict"] = function() {Os.pop(); Os.push({});};
- Sd["get"] = function() {
+ def("dict", function() {Os.pop(); Os.push({});});
+ def("get", function() {
var K = Os.pop();
var D = Os.pop();
// TODO other datatypes
- if(isSymbol(K)) Os.push(D[symbolName(K)]);
+ if(isSymbol(K)) Os.push(D[K]);
else Os.push(D[K]);
- };
- Sd["put"] = function() {
+ });
+ def("put", function() {
var V = Os.pop();
var K = Os.pop();
var D = Os.pop();
// TODO other datatypes
- if(isSymbol(K)) D[symbolName(K)] = V;
+ if(isSymbol(K)) D[K] = V;
else D[K] = V;
- };
- Sd["begin"] = function() {Ds.push(Os.pop());};
- Sd["end"] = function() {Ds.pop();};
- Sd["currentdict"] = function() {Os.push(Ds[Ds.length - 1]);};
- Sd["where"] = function() {
- var K = symbolName(Os.pop());
+ });
+ def("begin", function() {Ds.push(Os.pop());});
+ def("end", function() {Ds.pop();});
+ def("currentdict", function() {Os.push(Ds[Ds.length - 1]);});
+ def("where", function() {
+ var K = Os.pop();
var D = inDs(Ds, K);
if(D) {
Os.push(D);
Os.push(true);
} else Os.push(false);
- };
+ });
// miscellaneous
- Sd["save"] = function() {
+ def("save", function() {
var X = Ds.slice();
for(var I = 0; I < X.length; I++) {
var A = X[I];
@@ -374,15 +366,15 @@ function Wps() {
X[I] = B;
}
Os.push(X);
- };
- Sd["restore"] = function() {
+ });
+ def("restore", function() {
var X = Os.pop();
while(0 < Ds.length)
Ds.pop();
while(0 < X.length)
Ds.unshift(X.pop());
- };
- Sd["type"] = function() {
+ });
+ def("type", function() {
var A = Os.pop();
var X;
if(null === A) X = "nulltype";
@@ -401,19 +393,18 @@ function Wps() {
// fonttype
// gstatetype (LanguageLevel 2)
// savetype
- };
+ });
var Sb = true;
- Sd[".strictBind"] = function() {Sb = true === Os.pop();};
- Sd["bind"] = function() {Os.push(bind(Os.pop()));};
+ def(".strictBind", function() {Sb = true === Os.pop();});
+ def("bind", function() {Os.push(bind(Os.pop()));});
function bind(X) {
if(isSymbol(X) && !isQuoted(X)) {
- var K = symbolName(X);
- var D = inDs(Ds, K);
+ var D = inDs(Ds, X);
if(Sb) {
if(!D)
- throw "bind error '" + K + "'";
- return bind(D[K]);
- } else return !D ? X : bind(D[K]);
+ throw "bind error '" + X + "'";
+ return bind(D[X]);
+ } else return !D ? X : bind(D[X]);
} else if(isArray(X) && isQuoted(X)) {
var N = X.length;
var A = [];
@@ -430,39 +421,39 @@ function Wps() {
return X;
}
// debugging
- Sd["="] = function() {var X = Os.pop(); alert(X && X.nm || X);}; // TODO
- Sd["=="] = function() {alert(Os.pop());}; // TODO
- Sd["stack"] = function() {alert(Os);}; // TODO
- Sd["pstack"] = function() {alert(Os);}; // TODO
+ def("=", function() {var X = Os.pop(); alert(X);}); // TODO
+ def("==", function() {alert(Os.pop());}); // TODO
+ def("stack", function() {alert(Os);}); // TODO
+ def("pstack", function() {alert(Os);}); // TODO
// js ffi
- Sd[".call"] = function() {
+ def(".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() {Os.push(Math);};
- Sd[".date"] = function() {Os.push(new Date());}; // TODO split new and Date
- Sd[".window"] = function() {Os.push(window);};
- Sd[".callback"] = function() { // TODO event arg?
+ });
+ def(".math", function() {Os.push(Math);});
+ def(".date", function() {Os.push(new Date());}); // TODO split new and Date
+ def(".window", function() {Os.push(window);});
+ def(".callback", function() { // TODO event arg?
var X = Os.pop();
Os.push(function() {
Ps.run(X, true);
while(0 < Es.length)
Ps.step();
});
- };
+ });
// html5
- Sd[".minv"] = function() { // TODO in ps
+ def(".minv", function() { // TODO in ps
var M = Os.pop();
var a = M[0]; var b = M[1];
var d = M[2]; var e = M[3];
var g = M[4]; var h = M[5];
Os.push([e, b, d, a, d*h-e*g, b*g-a*h]);
- };
- Sd[".mmul"] = function() { // TODO in ps
+ });
+ def(".mmul", function() { // TODO in ps
var B = Os.pop();
var A = Os.pop();
var a = A[0]; var b = A[1];
@@ -472,28 +463,28 @@ function Wps() {
var u = B[2]; var v = B[3];
var x = B[4]; var y = B[5];
Os.push([a*r+b*u, a*s+b*v, d*r+e*u, d*s+e*v, g*r+h*u+x, g*s+h*v+y]);
- };
- Sd[".xy"] = function() { // TODO in ps
+ });
+ def(".xy", function() { // TODO in ps
var M = Os.pop();
var Y = Os.pop();
var X = Os.pop();
Os.push(M[0] * X + M[2] * Y + M[4]);
Os.push(M[1] * X + M[3] * Y + M[5]);
- };
+ });
// TODO js ffi to manipulate strings so the following can be in ps
- Sd[".rgb"] = function() { // TODO in ps
+ def(".rgb", function() { // TODO in ps
var B = Os.pop();
var G = Os.pop();
var R = Os.pop();
Os.push("rgb(" + R + "," + G + "," + B + ")");
- };
- Sd[".rgba"] = function() { // TODO in ps
+ });
+ def(".rgba", function() { // TODO in ps
var A = Os.pop();
var B = Os.pop();
var G = Os.pop();
var R = Os.pop();
Os.push("rgba(" + R + "," + G + "," + B + "," + A + ")");
- };
+ });
function parse() {
var T = arguments;