From 714eb87844e0a5d538c3a821a89f6ae3f9b27fb7 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Sun, 4 Mar 2012 20:24:34 -0500 Subject: [PATCH] trying to extend web world for this. --- examples/js-binding.rkt | 11 -------- js/js-impl.js | 6 ++--- js/world/js-impl.js | 39 ++++++++++++++++++++++++++++ js/world/main.rkt | 6 +++++ js/world/racket-impl.rkt | 1 + tests/more-tests/js-binding.expected | 7 +++++ tests/more-tests/js-binding.rkt | 29 +++++++++++++++++++++ tests/run-more-tests.rkt | 1 + version.rkt | 2 +- web-world/js-impl.js | 6 ++++- 10 files changed, 92 insertions(+), 16 deletions(-) delete mode 100644 examples/js-binding.rkt create mode 100644 js/world/js-impl.js create mode 100644 js/world/main.rkt create mode 100644 js/world/racket-impl.rkt create mode 100644 tests/more-tests/js-binding.expected create mode 100644 tests/more-tests/js-binding.rkt diff --git a/examples/js-binding.rkt b/examples/js-binding.rkt deleted file mode 100644 index 0a148d1..0000000 --- a/examples/js-binding.rkt +++ /dev/null @@ -1,11 +0,0 @@ -#lang planet dyoo/whalesong -(require (planet dyoo/whalesong/js)) - -(define js-plus - (js-function (js-eval "function(x, y) { return x + y; }"))) - -(define js-minus - (js-function (js-eval "function(x, y) { return x - y; }"))) - -"plus: " (js-plus 3 4) -"minus:" (js-minus 239748 23) \ No newline at end of file diff --git a/js/js-impl.js b/js/js-impl.js index e97fcc8..221c277 100644 --- a/js/js-impl.js +++ b/js/js-impl.js @@ -173,7 +173,7 @@ for (i = 0; i < MACHINE.a ; i = i+1) { args.push(MACHINE.e[MACHINE.e.length - 1 - i]); } - return f.call(null, args); + return f.apply(null, args); }); }); @@ -199,7 +199,7 @@ MACHINE, plt.baselib.format.format( "~a", - [((e && e.message) ? e.message : "unknown error")])); + [((e && e.message) ? e.message : e || "unknown error")])); }); }; @@ -210,7 +210,7 @@ } args.unshift(onFail); args.unshift(onSuccess); - return f.call(null, args); + return f.apply(null, args); }); }); }); diff --git a/js/world/js-impl.js b/js/world/js-impl.js new file mode 100644 index 0000000..a8427c8 --- /dev/null +++ b/js/world/js-impl.js @@ -0,0 +1,39 @@ + +(function() { + "use strict"; + + var resourceStructType = + MACHINE.modules['whalesong/web-world.rkt'].getNamespace().get(''); + + + /** + * Creates an event source coupled to a JavaScript function. Calling the function + * should cause the event source to fire. + */ + var makeJsEventSource = function() { + var enabled = false; + var fireEvent; + + var JsEventSource = function() {}; + JsEventSource.prototype = plt.baselib.heir(EventSource.prototype); + JsEventSource.prototype.onStart = function(_fireEvent) { + enabled = true; + fireEvent = _fireEvent; + }; + JsEventSource.prototype.onStop = function() { + enabled = false; + fireEvent = void(0); + }; + + var sender = function() { + if (enabled) { + var args = Array.prototype.slice.call(arguments, 0); + args.unshift(void(0)); + fireEvent.apply(null, args); + } + }; + return { eventSource: new JsEventSource(), + sender: sender }; + }; + +}()); \ No newline at end of file diff --git a/js/world/main.rkt b/js/world/main.rkt new file mode 100644 index 0000000..7870a7b --- /dev/null +++ b/js/world/main.rkt @@ -0,0 +1,6 @@ +#lang s-exp "../lang/js/js.rkt" +(require "../../web-world.rkt") +(declare-implementation + #:racket "racket-impl.rkt" + #:javascript ("js-impl.js") + #:provided-values ()) \ No newline at end of file diff --git a/js/world/racket-impl.rkt b/js/world/racket-impl.rkt new file mode 100644 index 0000000..d553670 --- /dev/null +++ b/js/world/racket-impl.rkt @@ -0,0 +1 @@ +#lang s-exp "../../lang/base.rkt" diff --git a/tests/more-tests/js-binding.expected b/tests/more-tests/js-binding.expected new file mode 100644 index 0000000..7635e9d --- /dev/null +++ b/tests/more-tests/js-binding.expected @@ -0,0 +1,7 @@ +"plus: " +7 +"wait for one second: " +# +"minus:" +239725 +helloworldtesting \ No newline at end of file diff --git a/tests/more-tests/js-binding.rkt b/tests/more-tests/js-binding.rkt new file mode 100644 index 0000000..43204e5 --- /dev/null +++ b/tests/more-tests/js-binding.rkt @@ -0,0 +1,29 @@ +#lang planet dyoo/whalesong +(require (planet dyoo/whalesong/js)) + +(define js-plus + (js-function (js-eval "function(x, y) { return x + y; }"))) + +(define js-minus + (js-function (js-eval "function(x, y) { return x - y; }"))) + +(define sleep + (js-async-function (js-eval "function(success, fail, n) { setTimeout(success, n) }"))) + + +"plus: " (js-plus 3 4) +"wait for one second: " (sleep 1000) +"minus:" (js-minus 239748 23) + + +(for-each (lambda (x) + (display x) + (sleep 1000)) + '(hello world testing)) + + +;; I need exception handling... +;; +;(define i-should-fail +; (js-async-function (js-eval "function(success, fail) { fail('I should fail'); }"))) +;(i-should-fail) diff --git a/tests/run-more-tests.rkt b/tests/run-more-tests.rkt index 7cee348..88a7d0a 100644 --- a/tests/run-more-tests.rkt +++ b/tests/run-more-tests.rkt @@ -6,6 +6,7 @@ ;; content vs. a text file with the same name, but with the .rkt file ;; type replaced with .expected. +(test "more-tests/js-binding.rkt") (test "more-tests/simple.rkt") (test "more-tests/simple-loop.rkt") (test "more-tests/booleans.rkt") diff --git a/version.rkt b/version.rkt index cca1635..a3423f2 100644 --- a/version.rkt +++ b/version.rkt @@ -7,4 +7,4 @@ (provide version) (: version String) -(define version "1.218") +(define version "1.221") diff --git a/web-world/js-impl.js b/web-world/js-impl.js index 48a68bc..684b27d 100644 --- a/web-world/js-impl.js +++ b/web-world/js-impl.js @@ -929,7 +929,6 @@ EventSource.prototype.onStop = function() { }; - // TickEventSource sends tick events. @@ -2200,5 +2199,10 @@ }); + + + // For private importers of the web-world library, like the FFI's js/world library. + Exports['EventSource'] = EventSource; + Exports['EventHandler'] = EventHandler; ////////////////////////////////////////////////////////////////////// }()); \ No newline at end of file