diff --git a/js/js-impl.js b/js/js-impl.js index a76ceaf..636d40e 100644 --- a/js/js-impl.js +++ b/js/js-impl.js @@ -1,68 +1,135 @@ -var VOID = plt.baselib.constants.VOID_VALUE; -var makePrimitiveProcedure = plt.baselib.functions.makePrimitiveProcedure; +/*jslint devel: true, browser: false, unparam: true, sub: true, windows: false, vars: true, white: true, maxerr: 50, indent: 4 */ -EXPORTS['alert'] = - makePrimitiveProcedure( - 'alert', - 1, - function(MACHINE) { - var elt = MACHINE.e[MACHINE.e.length - 1]; - alert(String(elt)); - return VOID; - }); +/*global $,plt,EXPORTS,document,window*/ +(function() { + "use strict"; + + var VOID = plt.baselib.constants.VOID_VALUE; + var makePrimitiveProcedure = plt.baselib.functions.makePrimitiveProcedure; + var makeCheckArgumentType = plt.baselib.check.makeCheckArgumentType; + var checkSymbolOrString = plt.baselib.check.checkSymbolOrString; + var checkAny = makeCheckArgumentType(function(x) { return true; }, + "any"); + + EXPORTS['alert'] = + makePrimitiveProcedure( + 'alert', + 1, + function(MACHINE) { + var elt = MACHINE.e[MACHINE.e.length - 1]; + alert(String(elt)); + return VOID; + }); -EXPORTS['body'] = $(document.body); + EXPORTS['body'] = $(document.body); -EXPORTS['$'] = - makePrimitiveProcedure( - '$', - 1, - function(MACHINE) { - var obj = MACHINE.e[MACHINE.e.length - 1]; - return $(obj); - }); + EXPORTS['$'] = + makePrimitiveProcedure( + '$', + 1, + function(MACHINE) { + var obj = MACHINE.e[MACHINE.e.length - 1]; + return $(obj); + }); -EXPORTS['call-method'] = - makePrimitiveProcedure( - 'call-method', - plt.baselib.arity.makeArityAtLeast(2), - function(MACHINE) { - var obj = MACHINE.e[MACHINE.e.length - 1]; - var methodName = MACHINE.e[MACHINE.e.length - 2]; - var args = []; - for (var i = 0; i < MACHINE.a - 2; i++) { - args.push(MACHINE.e[MACHINE.e.length -1 - 2 - i]); - } - var result = obj[methodName].apply(obj, args); - return result; - }); + EXPORTS['call-method'] = + makePrimitiveProcedure( + 'call-method', + plt.baselib.arity.makeArityAtLeast(2), + function(MACHINE) { + var obj = MACHINE.e[MACHINE.e.length - 1]; + var methodName = MACHINE.e[MACHINE.e.length - 2]; + var args = [], i; + for (i = 0; i < MACHINE.a - 2; i = i+1) { + args.push(MACHINE.e[MACHINE.e.length -1 - 2 - i]); + } + var result = obj[methodName].apply(obj, args); + return result; + }); + + + EXPORTS['window'] = window; + + + EXPORTS['get-attr'] = + makePrimitiveProcedure( + 'get-attr', + plt.baselib.arity.makeArityAtLeast(2), + function(MACHINE) { + var obj = checkAny(MACHINE, 'get-attr', 0), attr, i; + for (i = 1; i < MACHINE.a; i = i + 1) { + attr = checkSymbolOrString(MACHINE, 'get-attr', i).toString(); + obj = obj[attr]; + } + return obj; + }); + + + EXPORTS['set-attr!'] = + makePrimitiveProcedure( + 'set-attr!', + 3, + function(MACHINE) { + var obj = checkAny(MACHINE, 'set-attr!', 0); + var attr = checkSymbolOrString(MACHINE, 'set-attr!', 1).toString(); + var val = checkAny(MACHINE, 'set-attr!', 2); + obj[attr] = val; + return VOID; + }); + + EXPORTS['js-string?'] = + makePrimitiveProcedure( + 'js-string?', + 1, + function(MACHINE) { + return typeof(checkAny(MACHINE, 'js-string?', 0)) === 'string'; + }); + + EXPORTS['string->js-string'] = + makePrimitiveProcedure( + 'string->js-string', + 1, + function(MACHINE) { + return checkString(MACHINE, 'string->js-string', 0).toString(); + }); + + EXPORTS['js-string->string'] = + makePrimitiveProcedure( + 'js-string->string', + 1, + function(MACHINE) { + return checkJsString(MACHINE, 'string->js-string', 0); + }); -// Javascript-specific extensions. A small experiment. -EXPORTS['viewport-width'] = - makePrimitiveProcedure( - 'viewport-width', - 0, - function(MACHINE) { - return $(window).width(); - }); - -EXPORTS['viewport-height'] = - makePrimitiveProcedure( - 'viewport-height', - 0, - function(MACHINE) { - return $(window).height(); - }); -EXPORTS['in-javascript-context?'] = - makePrimitiveProcedure( - 'in-javascript-context?', - 0, - function(MACHINE) { - return true; - }); + // Javascript-specific extensions. A small experiment. + EXPORTS['viewport-width'] = + makePrimitiveProcedure( + 'viewport-width', + 0, + function(MACHINE) { + return $(window).width(); + }); + + EXPORTS['viewport-height'] = + makePrimitiveProcedure( + 'viewport-height', + 0, + function(MACHINE) { + return $(window).height(); + }); + + + EXPORTS['in-javascript-context?'] = + makePrimitiveProcedure( + 'in-javascript-context?', + 0, + function(MACHINE) { + return true; + }); +}()); \ No newline at end of file diff --git a/js/main.rkt b/js/main.rkt index f07bd97..f4c77e5 100644 --- a/js/main.rkt +++ b/js/main.rkt @@ -8,6 +8,13 @@ call-method $ + get-attr + set-attr! + + js-string? + string->js-string + js-string->string + viewport-width viewport-height in-javascript-context? diff --git a/js/racket-impl.rkt b/js/racket-impl.rkt index 86a26e1..4787435 100644 --- a/js/racket-impl.rkt +++ b/js/racket-impl.rkt @@ -18,6 +18,23 @@ 'not-done-yet) +(define (get-attr object attr . other-attrs) + (error 'get-attr "Not available outside JavaScript context")) + + +(define (set-attr! obj attr value) + (error 'set-attr! "Not available outside JavaScript context")) + + + +(define (js-string? x) + (error 'js-string? "Not available outside JavaScript context")) +(define (string->js-string x) + (error 'string->js-string "Not available outside JavaScript context")) +(define (js-string->string x) + (error 'js-string->string "Not available outside JavaScript context")) + + ;; in-javascript-context: -> boolean diff --git a/storage/storage.rkt b/storage/storage.rkt new file mode 100644 index 0000000..5c9f73e --- /dev/null +++ b/storage/storage.rkt @@ -0,0 +1,3 @@ +#lang s-exp "../lang/base.rkt" + +(require "../js.rkt") \ No newline at end of file