getting more of the real types in

This commit is contained in:
Danny Yoo 2011-06-07 17:53:52 -04:00
parent 9050882d4d
commit 79a2dedd2d
6 changed files with 56 additions and 23 deletions

2
NOTES
View File

@ -728,6 +728,8 @@ Working out the type mappings between values in Racket and values in JavaScript
case-lambda case-lambda
undefined undefined
void plt.runtime.VOID
---------------------------------------------------------------------- ----------------------------------------------------------------------

View File

@ -107,7 +107,7 @@
[(boolean? val) [(boolean? val)
(if val "true" "false")] (if val "true" "false")]
[(void? val) [(void? val)
"null"] "RUNTIME.VOID"]
[(empty? val) [(empty? val)
(format "RUNTIME.NULL")] (format "RUNTIME.NULL")]
[(number? val) [(number? val)

View File

@ -570,14 +570,15 @@ if (! this['plt']) { this['plt'] = {}; }
if (! cache) { if (! cache) {
cache = makeLowLevelEqHash(); cache = makeLowLevelEqHash();
} }
if (x === null) {
return "null";
}
if (typeof(x) === 'object') { if (typeof(x) === 'object') {
if (cache.containsKey(x)) { if (cache.containsKey(x)) {
return "..."; return "...";
} }
} }
if (x == undefined) {
if (x == undefined || x == null) {
return "#<undefined>"; return "#<undefined>";
} }
if (typeof(x) == 'string') { if (typeof(x) == 'string') {
@ -606,12 +607,14 @@ if (! this['plt']) { this['plt'] = {}; }
if (! cache) { if (! cache) {
cache = makeLowLevelEqHash(); cache = makeLowLevelEqHash();
} }
if (x === null) {
return "null";
}
if (typeof(x) === 'object') { if (typeof(x) === 'object') {
if (cache.containsKey(x)) { if (cache.containsKey(x)) {
return "..."; return "...";
} }
} }
if (x == undefined || x == null) { if (x == undefined || x == null) {
return "#<undefined>"; return "#<undefined>";
} }
@ -690,6 +693,12 @@ if (! this['plt']) { this['plt'] = {}; }
return numberToDomNode(x, params); return numberToDomNode(x, params);
} }
if (x === null) {
var node = document.createElement("span");
node.appendChild(document.createTextNode("null"));
return node;
}
if (typeof(x) == 'object') { if (typeof(x) == 'object') {
if (params.containsKey(x)) { if (params.containsKey(x)) {
var node = document.createElement("span"); var node = document.createElement("span");

View File

@ -34,6 +34,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
var isList = types.isList; var isList = types.isList;
var isVector = types.isVector; var isVector = types.isVector;
var NULL = types.EMPTY; var NULL = types.EMPTY;
var VOID = types.VOID;
var makeVector = types.vector; var makeVector = types.vector;
var makeList = types.list; var makeList = types.list;
@ -41,6 +42,8 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
var heir = helpers.heir; var heir = helpers.heir;
var toDomNode = helpers.toDomNode; var toDomNode = helpers.toDomNode;
var toWrittenString = helpers.toWrittenString;
var toDisplayedString = helpers.toDisplayedString;
//////////////////////////////////////////////////////////////////////] //////////////////////////////////////////////////////////////////////]
@ -530,6 +533,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
outputPort = MACHINE.env[MACHINE.env.length-2]; outputPort = MACHINE.env[MACHINE.env.length-2];
} }
outputPort.writeDomNode(MACHINE, toDomNode(firstArg, 'display')); outputPort.writeDomNode(MACHINE, toDomNode(firstArg, 'display'));
return VOID;
}; };
Primitives['display'].arity = makeList(1, 2); Primitives['display'].arity = makeList(1, 2);
Primitives['display'].displayName = 'display'; Primitives['display'].displayName = 'display';
@ -547,6 +551,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
outputPort = MACHINE.env[MACHINE.env.length-1]; outputPort = MACHINE.env[MACHINE.env.length-1];
} }
outputPort.writeDomNode(MACHINE, toDomNode("\n", 'display')); outputPort.writeDomNode(MACHINE, toDomNode("\n", 'display'));
return VOID;
}; };
Primitives['newline'].arity = makeList(0, 1); Primitives['newline'].arity = makeList(0, 1);
Primitives['newline'].displayName = 'newline'; Primitives['newline'].displayName = 'newline';
@ -566,6 +571,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
} }
outputPort.writeDomNode(MACHINE, toDomNode(firstArg, 'display')); outputPort.writeDomNode(MACHINE, toDomNode(firstArg, 'display'));
outputPort.writeDomNode(MACHINE, toDomNode("\n", 'display')); outputPort.writeDomNode(MACHINE, toDomNode("\n", 'display'));
return VOID;
}; };
Primitives['displayln'].arity = makeList(1, 2); Primitives['displayln'].arity = makeList(1, 2);
Primitives['displayln'].displayName = 'displayln'; Primitives['displayln'].displayName = 'displayln';
@ -876,6 +882,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
var firstArg = MACHINE.env[MACHINE.env.length-1]; var firstArg = MACHINE.env[MACHINE.env.length-1];
var secondArg = MACHINE.env[MACHINE.env.length-2]; var secondArg = MACHINE.env[MACHINE.env.length-2];
firstArg.first = secondArg; firstArg.first = secondArg;
return VOID;
}; };
Primitives['set-car!'].arity = 2; Primitives['set-car!'].arity = 2;
Primitives['set-car!'].displayName = 'set-car!'; Primitives['set-car!'].displayName = 'set-car!';
@ -890,6 +897,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
var firstArg = MACHINE.env[MACHINE.env.length-1]; var firstArg = MACHINE.env[MACHINE.env.length-1];
var secondArg = MACHINE.env[MACHINE.env.length-2]; var secondArg = MACHINE.env[MACHINE.env.length-2];
firstArg.rest = secondArg; firstArg.rest = secondArg;
return VOID;
}; };
Primitives['set-cdr!'].arity = 2; Primitives['set-cdr!'].arity = 2;
Primitives['set-cdr!'].displayName = 'set-cdr!'; Primitives['set-cdr!'].displayName = 'set-cdr!';
@ -916,8 +924,8 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
for (i = 0; i < MACHINE.argcount; i++) { for (i = 0; i < MACHINE.argcount; i++) {
result.push(MACHINE.env[MACHINE.env.length-1-i]); result.push(MACHINE.env[MACHINE.env.length-1-i]);
} }
result.type = 'vector'; var newVector = makeVector.apply(null, result);
return makeVector.apply(null, result); return newVector;
}; };
Primitives['vector'].arity = new ArityAtLeast(0); Primitives['vector'].arity = new ArityAtLeast(0);
Primitives['vector'].displayName = 'vector'; Primitives['vector'].displayName = 'vector';
@ -973,11 +981,17 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length - 1], MACHINE.env[MACHINE.env.length - 1],
0, 0,
'vector-set!'); 'vector-set!');
testArgument(MACHINE,
'natural',
isNatural,
MACHINE.env[MACHINE.env.length - 2],
1,
'vector-set!');
var elts = MACHINE.env[MACHINE.env.length-1].elts; var elts = MACHINE.env[MACHINE.env.length-1].elts;
var index = jsnums.toFixnum(MACHINE.env[MACHINE.env.length-2]); var index = jsnums.toFixnum(MACHINE.env[MACHINE.env.length-2]);
var val = MACHINE.env[MACHINE.env.length-3]; var val = MACHINE.env[MACHINE.env.length-3];
elts[index] = val; elts[index] = val;
return null; return VOID;
}; };
Primitives['vector-set!'].arity = 3; Primitives['vector-set!'].arity = 3;
Primitives['vector-set!'].displayName = 'vector-set!'; Primitives['vector-set!'].displayName = 'vector-set!';
@ -1073,13 +1087,13 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
var firstArg = MACHINE.env[MACHINE.env.length-1]; var firstArg = MACHINE.env[MACHINE.env.length-1];
var secondArg = MACHINE.env[MACHINE.env.length-2]; var secondArg = MACHINE.env[MACHINE.env.length-2];
firstArg[0] = secondArg; firstArg[0] = secondArg;
return; return VOID;
}; };
Primitives['set-box!'].arity = 2; Primitives['set-box!'].arity = 2;
Primitives['set-box!'].displayName = 'set-box!'; Primitives['set-box!'].displayName = 'set-box!';
Primitives['void'] = function(MACHINE) { Primitives['void'] = function(MACHINE) {
return; return VOID;
}; };
Primitives['void'].arity = new ArityAtLeast(0); Primitives['void'].arity = new ArityAtLeast(0);
Primitives['void'].displayName = 'void'; Primitives['void'].displayName = 'void';
@ -1347,6 +1361,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
exports['DEFAULT_CONTINUATION_PROMPT_TAG'] = exports['DEFAULT_CONTINUATION_PROMPT_TAG'] =
DEFAULT_CONTINUATION_PROMPT_TAG; DEFAULT_CONTINUATION_PROMPT_TAG;
exports['NULL'] = NULL; exports['NULL'] = NULL;
exports['VOID'] = VOID;
exports['testArgument'] = testArgument; exports['testArgument'] = testArgument;
exports['testArity'] = testArity; exports['testArity'] = testArity;
@ -1382,10 +1397,15 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
exports['isOutputStringPort'] = isOutputStringPort; exports['isOutputStringPort'] = isOutputStringPort;
exports['isEqual'] = isEqual; exports['isEqual'] = isEqual;
exports['toDomNode'] = toDomNode;
exports['toWrittenString'] = toWrittenString;
exports['toDisplayedString'] = toDisplayedString;
// Type constructors // Type constructors
exports['makeList'] = makeList; exports['makeList'] = makeList;
exports['makePair'] = makePair; exports['makePair'] = makePair;
exports['makeVector'] = makeVector;
exports['ArityAtLeast'] = ArityAtLeast; exports['ArityAtLeast'] = ArityAtLeast;

View File

@ -1951,12 +1951,12 @@ String.prototype.toDisplayedString = function(cache) {
}; };
var makeVector = function(arguments) { var makeVector = function() {
return Vector.makeInstance(arguments.length, arguments); return Vector.makeInstance(arguments.length, arguments);
}; };
var makeVectorImmutable = function(arguments) { var makeVectorImmutable = function() {
var v = Vector.makeInstance(arguments.length, arguments); var v = Vector.makeInstance(arguments.length, arguments);
v.mutable = false; v.mutable = false;
return v; return v;
@ -1983,7 +1983,7 @@ String.prototype.toDisplayedString = function(cache) {
' given ' + s.toString(), ' given ' + s.toString(),
false); false);
} }
} };
var makeHashEq = function(lst) { var makeHashEq = function(lst) {
@ -1993,7 +1993,7 @@ String.prototype.toDisplayedString = function(cache) {
lst = lst.rest; lst = lst.rest;
} }
return newHash; return newHash;
} };
var makeHashEqual = function(lst) { var makeHashEqual = function(lst) {
@ -2003,7 +2003,7 @@ String.prototype.toDisplayedString = function(cache) {
lst = lst.rest; lst = lst.rest;
} }
return newHash; return newHash;
} };
var Color = makeStructureType('color', false, 3, 0, false, false); var Color = makeStructureType('color', false, 3, 0, false, false);

View File

@ -45,11 +45,12 @@
"(function() { " "(function() { "
runtime runtime
"var RUNTIME = plt.runtime;"
"var MACHINE = new plt.runtime.Machine();\n" "var MACHINE = new plt.runtime.Machine();\n"
"return function(success, fail, params){" "return function(success, fail, params){"
snippet snippet
(format "success(String(~a)); };" inspector) (format "success(plt.runtime.toDisplayedString(~a)); };" inspector)
"});")]) "});")])
(displayln snippet) (displayln snippet)
(display code op)))))) (display code op))))))
@ -63,6 +64,7 @@
[inspector (cdr a-statement+inspector)]) [inspector (cdr a-statement+inspector)])
(display runtime op) (display runtime op)
"var RUNTIME = plt.runtime;"
(display "var MACHINE = new plt.runtime.Machine();\n" op) (display "var MACHINE = new plt.runtime.Machine();\n" op)
(display "(function() { " op) (display "(function() { " op)
(display "var myInvoke = " op) (display "var myInvoke = " op)
@ -70,7 +72,7 @@
(display ";" op) (display ";" op)
(fprintf op (fprintf op
"return function(succ, fail, params) { myInvoke(MACHINE, function(v) { succ(String(~a));}, fail, params); }" "return function(succ, fail, params) { myInvoke(MACHINE, function(v) { succ(plt.runtime.toDisplayedString(~a));}, fail, params); }"
inspector) inspector)
(display "})" op)))))) (display "})" op))))))
(define (E-many stmts (inspector "MACHINE.val")) (define (E-many stmts (inspector "MACHINE.val"))
@ -91,13 +93,13 @@
"Danny") "Danny")
;; Assigning a cons ;; Assigning a cons
(test (E-single (make-AssignImmediateStatement 'val (make-Const (cons 1 2)))) (test (E-single (make-AssignImmediateStatement 'val (make-Const (cons 1 2))))
"1,2") "(1 . 2)")
;; Assigning a void ;; Assigning a void
(test (E-single (make-AssignImmediateStatement 'val (make-Const (void)))) (test (E-single (make-AssignImmediateStatement 'val (make-Const (void))))
"null") "#<void>")
;; Assigning to proc means val should still be uninitialized. ;; Assigning to proc means val should still be uninitialized.
(test (E-single (make-AssignImmediateStatement 'proc (make-Const "Danny"))) (test (E-single (make-AssignImmediateStatement 'proc (make-Const "Danny")))
"undefined") "#<undefined>")
;; But we should see the assignment if we inspect MACHINE.proc. ;; But we should see the assignment if we inspect MACHINE.proc.
(test (E-single (make-AssignImmediateStatement 'proc (make-Const "Danny")) (test (E-single (make-AssignImmediateStatement 'proc (make-Const "Danny"))
"MACHINE.proc") "MACHINE.proc")
@ -133,7 +135,7 @@
(make-AssignImmediateStatement (make-EnvLexicalReference 0 #f) (make-AssignImmediateStatement (make-EnvLexicalReference 0 #f)
(make-Const 12345))) (make-Const 12345)))
"MACHINE.env[0]") "MACHINE.env[0]")
"undefined") "#<undefined>")
(test (E-many (list (make-PushEnvironment 2 #f) (test (E-many (list (make-PushEnvironment 2 #f)
(make-AssignImmediateStatement (make-EnvLexicalReference 1 #f) (make-AssignImmediateStatement (make-EnvLexicalReference 1 #f)
(make-Const 12345))) (make-Const 12345)))
@ -143,7 +145,7 @@
;; Toplevel Environment loading ;; Toplevel Environment loading
(test (E-single (make-PerformStatement (make-ExtendEnvironment/Prefix! '(pi))) (test (E-single (make-PerformStatement (make-ExtendEnvironment/Prefix! '(pi)))
"String(MACHINE.env[0]).slice(0, 5)") "plt.runtime.toWrittenString(MACHINE.env[0]).slice(0, 5)")
"3.141") "3.141")
@ -210,7 +212,7 @@
(make-Const 0)) (make-Const 0))
(make-GotoStatement (make-Label 'closureStart)) (make-GotoStatement (make-Label 'closureStart))
'theEnd) 'theEnd)
"String(MACHINE.env.length) + ',' + MACHINE.env[1] + ',' + MACHINE.env[0]") "plt.runtime.toWrittenString(MACHINE.env.length) + ',' + MACHINE.env[1] + ',' + MACHINE.env[0]")
"2,hello,world") "2,hello,world")