integrating jsnums

This commit is contained in:
Danny Yoo 2011-06-02 16:23:17 -04:00
parent 0add763beb
commit 58294db03d
3 changed files with 123 additions and 79 deletions

View File

@ -19,7 +19,8 @@
assemble-arity
assemble-jump
assemble-display-name
assemble-location)
assemble-location
assemble-numeric-constant)
(require/typed typed/racket/base
[regexp-split (Regexp String -> (Listof String))])
@ -110,7 +111,7 @@
[(empty? val)
(format "RUNTIME.NULL")]
[(number? val)
(format "(~s)" val)]
(assemble-numeric-constant val)]
[else
(format "~s" val)])))
@ -126,6 +127,15 @@
(: assemble-numeric-constant (Number -> String))
(define (assemble-numeric-constant val)
(format "(~s)" val))
(: assemble-lexical-reference (EnvLexicalReference -> String))
(define (assemble-lexical-reference a-lex-ref)
(if (EnvLexicalReference-unbox? a-lex-ref)

View File

@ -5,7 +5,8 @@
"../compiler/lexical-structs.rkt"
"../compiler/kernel-primitives.rkt"
racket/string
racket/list)
racket/list
typed/rackunit)
(provide open-code-kernel-primitive-procedure)
@ -28,45 +29,48 @@
(case operator
[(+)
(cond [(empty? checked-operands)
"0"]
(assemble-numeric-constant 0)]
[else
(string-append "(" (string-join checked-operands " + ") ")")])]
(assemble-binop-chain "jsnums.add" checked-operands)])]
[(-)
(cond [(empty? (rest checked-operands))
(format "(-(~a))" (first checked-operands))]
(assemble-binop-chain "jsnums.subtract" (cons "0" checked-operands))]
[else
(string-append "(" (string-join checked-operands "-") ")")])]
(assemble-binop-chain "jsnums.subtract" checked-operands)])]
[(*)
(cond [(empty? checked-operands)
"1"]
(assemble-numeric-constant 1)]
[else
(string-append "(" (string-join checked-operands "*") ")")])]
(assemble-binop-chain "jsnums.multiply" checked-operands)])]
[(/)
(string-append "(" (string-join checked-operands "/") ")")]
(assemble-binop-chain "jsnums.divide" checked-operands)]
[(add1)
(format "(~a + 1)" (first checked-operands))]
(assemble-binop-chain "jsnums.add" (cons "1" checked-operands))]
[(sub1)
(format "(~a - 1)" (first checked-operands))]
(assemble-binop-chain "jsnums.subtract" (append checked-operands (list "1")))]
[(<)
(assemble-chain "<" checked-operands)]
(assemble-boolean-chain "jsnums.lessThan" checked-operands)]
[(<=)
(assemble-chain "<=" checked-operands)]
(assemble-boolean-chain "jsnums.lessThanOrEqual" checked-operands)]
[(=)
(assemble-chain "===" checked-operands)]
(assemble-boolean-chain "jsnums.equals" checked-operands)]
[(>)
(assemble-chain ">" checked-operands)]
(assemble-boolean-chain "jsnums.greaterThan" checked-operands)]
[(>=)
(assemble-chain ">=" checked-operands)]
(assemble-boolean-chain "jsnums.greaterThanOrEqual" checked-operands)]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[(cons)
(format "[~a, ~a]" (first checked-operands) (second checked-operands))]
@ -95,8 +99,32 @@
(format "(~a === ~a)" (first checked-operands) (second checked-operands))])))
(: assemble-chain (String (Listof String) -> String))
(define (assemble-chain rator rands)
(: assemble-binop-chain (String (Listof String) -> String))
(define (assemble-binop-chain rator rands)
(cond
[(empty? rands)
""]
[(empty? (rest rands))
(first rands)]
[else
(assemble-binop-chain
rator
(cons (string-append rator "(" (first rands) ", " (second rands) ")")
(rest (rest rands))))]))
(check-equal? (assemble-binop-chain "jsnums.add" '("3" "4" "5"))
"jsnums.add(jsnums.add(3, 4), 5)")
(check-equal? (assemble-binop-chain "jsnums.subtract" '("0" "42"))
"jsnums.subtract(0, 42)")
(: assemble-boolean-chain (String (Listof String) -> String))
(define (assemble-boolean-chain rator rands)
(string-append "("
(string-join (let: loop : (Listof String) ([rands : (Listof String) rands])
(cond
@ -105,7 +133,7 @@
[(empty? (rest rands))
'()]
[else
(cons (format "(~a ~a ~a)" (first rands) rator (second rands))
(cons (format "(~a(~a,~a))" rator (first rands) (second rands))
(loop (rest rands)))]))
"&&")
")"))

View File

@ -23,12 +23,10 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
};
var isNumber = function(x) { return typeof(x) === 'number'; };
var isNatural = function(x) { return typeof(x) === 'number' &&
x >= 0 &&
Math.floor(x) === x; };
var isNumber = jsnums.isSchemeNumber;
var isNatural = function(x) { return (jsnums.isInteger(x) &&
jsnums.greaterThanOrEqual(x, 0)); }
var isPair = function(x) { return (typeof(x) == 'object' &&
x.length === 2 &&
@ -605,9 +603,9 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
Primitives['pi'] = Math.PI;
Primitives['pi'] = jsnums.pi;
Primitives['e'] = Math.E;
Primitives['e'] = jsnums.e;
Primitives['='] = function(MACHINE) {
var firstArg = MACHINE.env[MACHINE.env.length-1];
@ -619,8 +617,8 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length - 1 - i],
i,
'=');
if (MACHINE.env[MACHINE.env.length - 1 - i] !==
MACHINE.env[MACHINE.env.length - 1 - i - 1]) {
if (! (jsnums.equals(MACHINE.env[MACHINE.env.length - 1 - i],
MACHINE.env[MACHINE.env.length - 1 - i - 1]))) {
return false;
}
}
@ -641,8 +639,8 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length - 1 - i],
i,
'<');
if (! (MACHINE.env[MACHINE.env.length - 1 - i] <
MACHINE.env[MACHINE.env.length - 1 - i - 1])) {
if (! (jsnums.lessThan(MACHINE.env[MACHINE.env.length - 1 - i],
MACHINE.env[MACHINE.env.length - 1 - i - 1]))) {
return false;
}
}
@ -662,8 +660,8 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length - 1 - i],
i,
'>');
if (! (MACHINE.env[MACHINE.env.length - 1 - i] >
MACHINE.env[MACHINE.env.length - 1 - i - 1])) {
if (! (jsnums.greaterThan(MACHINE.env[MACHINE.env.length - 1 - i],
MACHINE.env[MACHINE.env.length - 1 - i - 1]))) {
return false;
}
}
@ -683,8 +681,8 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length - 1 - i],
i,
'<=');
if (! (MACHINE.env[MACHINE.env.length - 1 - i] <=
MACHINE.env[MACHINE.env.length - 1 - i - 1])) {
if (! (jsnums.lessThanOrEqual(MACHINE.env[MACHINE.env.length - 1 - i],
MACHINE.env[MACHINE.env.length - 1 - i - 1]))) {
return false;
}
}
@ -705,8 +703,8 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length - 1 - i],
i,
'>=');
if (! (MACHINE.env[MACHINE.env.length - 1 - i] >=
MACHINE.env[MACHINE.env.length - 1 - i - 1])) {
if (! (jsnums.greaterThanOrEqual(MACHINE.env[MACHINE.env.length - 1 - i],
MACHINE.env[MACHINE.env.length - 1 - i - 1]))) {
return false;
}
}
@ -726,7 +724,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length - 1 - i],
i,
'+');
result += MACHINE.env[MACHINE.env.length - 1 - i];
result = jsnums.add(result, MACHINE.env[MACHINE.env.length - 1 - i]);
};
return result;
};
@ -744,7 +742,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length - 1 - i],
i,
'*');
result *= MACHINE.env[MACHINE.env.length - 1 - i];
result = jsnums.multiply(result, MACHINE.env[MACHINE.env.length - 1 - i]);
}
return result;
};
@ -759,7 +757,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length-1],
0,
'-');
return -(MACHINE.env[MACHINE.env.length-1]);
return jsnums.subtract(0, MACHINE.env[MACHINE.env.length-1]);
}
var result = MACHINE.env[MACHINE.env.length - 1];
for (var i = 1; i < MACHINE.argcount; i++) {
@ -769,7 +767,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length-1-i],
i,
'-');
result -= MACHINE.env[MACHINE.env.length - 1 - i];
result = jsnums.subtract(result, MACHINE.env[MACHINE.env.length - 1 - i]);
}
return result;
};
@ -791,7 +789,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length-1-i],
i,
'/');
result /= MACHINE.env[MACHINE.env.length - 1 - i];
result = jsnums.divide(result, MACHINE.env[MACHINE.env.length - 1 - i]);
}
return result;
};
@ -799,6 +797,47 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
Primitives['/'].displayName = '/';
Primitives['add1'] = function(MACHINE) {
testArgument(MACHINE,
'number',
isNumber,
MACHINE.env[MACHINE.env.length - 1],
0,
'add1');
var firstArg = MACHINE.env[MACHINE.env.length-1];
return jsnums.add(firstArg, 1);
};
Primitives['add1'].arity = 1;
Primitives['add1'].displayName = 'add1';
Primitives['sub1'] = function(MACHINE) {
testArgument(MACHINE,
'number',
isNumber,
MACHINE.env[MACHINE.env.length - 1],
0,
'sub1');
var firstArg = MACHINE.env[MACHINE.env.length-1];
return jsnums.subtract(firstArg, 1);
};
Primitives['sub1'].arity = 1;
Primitives['sub1'].displayName = 'sub1';
Primitives['zero?'] = function(MACHINE) {
var firstArg = MACHINE.env[MACHINE.env.length-1];
return jsnums.equals(firstArg, 0);
};
Primitives['zero?'].arity = 1;
Primitives['zero?'].displayName = 'zero?';
Primitives['cons'] = function(MACHINE) {
var firstArg = MACHINE.env[MACHINE.env.length-1];
var secondArg = MACHINE.env[MACHINE.env.length-2];
@ -896,39 +935,6 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
Primitives['null?'].arity = 1;
Primitives['null?'].displayName = 'null?';
Primitives['add1'] = function(MACHINE) {
testArgument(MACHINE,
'number',
isNumber,
MACHINE.env[MACHINE.env.length - 1],
0,
'add1');
var firstArg = MACHINE.env[MACHINE.env.length-1];
return firstArg + 1;
};
Primitives['add1'].arity = 1;
Primitives['add1'].displayName = 'add1';
Primitives['sub1'] = function(MACHINE) {
testArgument(MACHINE,
'number',
isNumber,
MACHINE.env[MACHINE.env.length - 1],
0,
'sub1');
var firstArg = MACHINE.env[MACHINE.env.length-1];
return firstArg - 1;
};
Primitives['sub1'].arity = 1;
Primitives['sub1'].displayName = 'sub1';
Primitives['zero?'] = function(MACHINE) {
var firstArg = MACHINE.env[MACHINE.env.length-1];
return firstArg === 0;
};
Primitives['zero?'].arity = 1;
Primitives['zero?'].displayName = 'zero?';
Primitives['vector'] = function(MACHINE) {
var i;
var result = [];
@ -994,7 +1000,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
0,
'vector-set!');
var firstArg = MACHINE.env[MACHINE.env.length-1];
var secondArg = MACHINE.env[MACHINE.env.length-2];
var secondArg = jsnums.toFixnum(MACHINE.env[MACHINE.env.length-2]);
var thirdArg = MACHINE.env[MACHINE.env.length-3];
firstArg[secondArg] = thirdArg;
return null;
@ -1010,7 +1016,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
MACHINE.env[MACHINE.env.length - 1],
0,
'vector-length');
var firstArg = MACHINE.env[MACHINE.env.length-1];
var firstArg = MACHINE.env[jsnums.toFixnum(MACHINE.env.length-1)];
return firstArg.length;
};
Primitives['vector-length'].arity = 1;
@ -1028,7 +1034,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
if (MACHINE.argcount == 2) {
value = MACHINE.env[MACHINE.env.length - 2];
}
var length = MACHINE.env[MACHINE.env.length-1];
var length = jsnums.toFixnum(MACHINE.env[MACHINE.env.length-1]);
var arr = [];
for(var i = 0; i < length; i++) {
arr[i] = value;