var PAUSE = plt.runtime.PAUSE; var makeClosure = plt.baselib.functions.makeClosure; var makeRational = plt.baselib.numbers.makeRational; var makePrimitiveProcedure = plt.baselib.functions.makePrimitiveProcedure; var checkNonNegativeReal = plt.baselib.check.checkNonNegativeReal; var checkString = plt.baselib.check.checkString; var checkProcedure = plt.baselib.check.checkProcedure; // More specific function checkers, based on arity. var checkProcedure1 = plt.baselib.check.makeCheckArgumentType( function(x) { return (plt.baselib.functions.isProcedure(x) && plt.baselib.arity.isArityMatching(x.racketArity, 1)); }, 'procedure that consumes a world argument'); var checkProcedureWithKey = plt.baselib.check.makeCheckArgumentType( function(x) { return (plt.baselib.functions.isProcedure(x) && plt.baselib.arity.isArityMatching(x.racketArity, 2)); }, 'procedure that consumes a world argument and a key'); var checkProcedureWithMouse = plt.baselib.check.makeCheckArgumentType( function(x) { return (plt.baselib.functions.isProcedure(x) && plt.baselib.arity.isArityMatching(x.racketArity, 4)); }, 'procedure that consumes a world argument, an x and y coordinate, and a mouse event'); var checkHandler = plt.baselib.check.makeCheckArgumentType( isWorldConfigOption, "world configuration handler"); // The default tick delay is 28 times a second. var DEFAULT_TICK_DELAY = 1/28; EXPORTS['big-bang'] = makeClosure( 'big-bang', plt.baselib.arity.makeArityAtLeast(1), function(MACHINE) { var initialWorldValue = MACHINE.e[MACHINE.e.length - 1]; var handlers = []; for (var i = 1; i < MACHINE.a; i++) { handlers.push(checkHandler(MACHINE, 'big-bang', i)); } bigBang(MACHINE, initialWorldValue, handlers); }); EXPORTS['on-tick'] = makePrimitiveProcedure( 'on-tick', plt.baselib.lists.makeList(1, 2), function(MACHINE) { if (MACHINE.a === 1) { var f = checkProcedure1(MACHINE, "on-tick", 0); return new OnTick(f, Math.floor(DEFAULT_TICK_DELAY * 1000)); } else if (MACHINE.a === 2) { var f = checkProcedure1(MACHINE, "on-tick", 0); var delay = checkNonNegativeReal(MACHINE, "on-tick", 1); return new OnTick(f, Math.floor(jsnums.toFixnum(delay) * 1000)); } }); EXPORTS['to-draw'] = makePrimitiveProcedure( 'to-draw', 1, function(MACHINE) { var f = checkProcedure1(MACHINE, "on-tick", 0); return new ToDraw(f); }); EXPORTS['stop-when'] = makePrimitiveProcedure( 'stop-when', 1, function(MACHINE) { var f = checkProcedure1(MACHINE, "on-tick", 0); return new StopWhen(f); }); EXPORTS['on-key'] = makePrimitiveProcedure( 'on-key', 1, function(MACHINE) { var f = checkProcedureWithKey(MACHINE, "on-key", 0); return new OnKey(f); }); EXPORTS['on-mouse'] = makePrimitiveProcedure( 'on-mouse', 1, function(MACHINE) { var f = checkProcedureWithMouse(MACHINE, "on-key", 0); return new OnMouse(f); }); EXPORTS['key=?'] = makePrimitiveProcedure( 'on-key', 2, function(MACHINE) { var k1 = checkString(MACHINE, "key=?", 0); var k2 = checkString(MACHINE, "key=?", 1); return k1.toString().toLowerCase() === k2.toString().toLowerCase(); });