From 4d5cbef31c0df45543c4976b2df8ce39e58fb704 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Thu, 30 Jun 2011 15:12:25 -0400 Subject: [PATCH] trying to make structs work --- js-assembler/runtime-src/runtime.js | 78 +++++++++++++++++++++++++++++ js-assembler/runtime-src/types.js | 62 +++++++++++------------ 2 files changed, 109 insertions(+), 31 deletions(-) diff --git a/js-assembler/runtime-src/runtime.js b/js-assembler/runtime-src/runtime.js index c9bf03a..411aec3 100644 --- a/js-assembler/runtime-src/runtime.js +++ b/js-assembler/runtime-src/runtime.js @@ -1998,6 +1998,84 @@ + installPrimitiveProcedure( + 'make-struct-field-accessor', + makeList(2, 3), + function(MACHINE) { + + var accessor, fieldPos, fieldName; + accessor = MACHINE.env[MACHINE.env.length-1]; + fieldPos = MACHINE.env[MACHINE.env.length-2]; + if (MACHINE.argcount === 2) { + fieldName = 'field' + fieldPos; + } else { + fieldName = MACHINE.env[MACHINE.env.length-3]; + } + + testArgument(MACHINE, + 'accessor procedure that requires a field index', + function(x) { + return (x instanceof types.StructAccessorProc && + x.numParams > 1); + }, + accessor, + 0, + 'make-struct-field-accessor'); + + testArgument(MACHINE, + 'exact non-negative integer', + isNatural, + fieldPos, + 'make-struct-field-accessor', + 1) + + testArgument(MACHINE, + 'symbol or #f', + function(x) { + return x === false || isSymbol(x); + }, + 'make-struct-field-accessor', + fieldName, + 2); + + + var procName = accessor.type.name + '-' fieldName; + return new types.StructAccessorProc( + accessor.type, + procName, + 1, + false, + false, + function(MACHINE) { + testArgument(MACHINE, + 'struct:' + accessor.type.name, + accessor.type.predicate, + MACHINE.env[MACHINE.env.length - 1], + procName, + 0); + return accessor.impl(x, fieldPos); + }); + + }); + + + + + + + + + + + + + + + + + + + diff --git a/js-assembler/runtime-src/types.js b/js-assembler/runtime-src/types.js index ebd1692..ce0be15 100644 --- a/js-assembler/runtime-src/types.js +++ b/js-assembler/runtime-src/types.js @@ -1788,37 +1788,37 @@ String.prototype.toDisplayedString = function(cache) { }; ////////////////////////////////////////////////////////////////////// - var makeOptionPrimitive = function(name, - numArgs, - defaultVals, - usesState, - bodyF) { - var makeNthPrimitive = function(n) { - return new PrimProc(name, - numArgs + n, - false, - usesState, - function() { - var expectedNumArgs = numArgs + n + (usesState ? 1 : 0); - assert.equal(arguments.length, - expectedNumArgs); - var args = [arguments]; - for (var i = 0; i < arguments.length; i++) { - args.push(arguments[i]); - } - var startDefaults = i - numArgs - (usesState ? 1 : 0); - return bodyF.apply( - bodyF, - args.concat(defaultVals.slice(startDefaults))); - }); - }; +// var makeOptionPrimitive = function(name, +// numArgs, +// defaultVals, +// usesState, +// bodyF) { +// var makeNthPrimitive = function(n) { +// return new PrimProc(name, +// numArgs + n, +// false, +// usesState, +// function() { +// var expectedNumArgs = numArgs + n + (usesState ? 1 : 0); +// assert.equal(arguments.length, +// expectedNumArgs); +// var args = [arguments]; +// for (var i = 0; i < arguments.length; i++) { +// args.push(arguments[i]); +// } +// var startDefaults = i - numArgs - (usesState ? 1 : 0); +// return bodyF.apply( +// bodyF, +// args.concat(defaultVals.slice(startDefaults))); +// }); +// }; - var cases = []; - for (var i = 0; i <= defaultVals.length; i++) { - cases.push(makeNthPrimitive(i)); - } - return new CasePrimitive(name, cases); - }; +// var cases = []; +// for (var i = 0; i <= defaultVals.length; i++) { +// cases.push(makeNthPrimitive(i)); +// } +// return new CasePrimitive(name, cases); +// }; @@ -2149,7 +2149,7 @@ String.prototype.toDisplayedString = function(cache) { types.CaseLambdaValue = CaseLambdaValue; types.PrimProc = PrimProc; types.CasePrimitive = CasePrimitive; - types.makeOptionPrimitive = makeOptionPrimitive; +// types.makeOptionPrimitive = makeOptionPrimitive; types.internalCall = function(op, args, k) { return new INTERNAL_CALL(op, args, k); }; types.isInternalCall = function(x) { return (x instanceof INTERNAL_CALL); };