diff options
author | Andy Wingo <wingo@pobox.com> | 2009-02-22 11:55:20 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2009-02-22 11:55:20 +0100 |
commit | 143177ed9ee93a2b8df326c431ef09de06ca8063 (patch) | |
tree | 73f92913a4dcad5cc6259260cee407d4be2616be /module/language/ecmascript/impl.scm | |
parent | a3e34104db5eded9e48f527ef54fe6c8d18a07f8 (diff) | |
download | guile-143177ed9ee93a2b8df326c431ef09de06ca8063.tar.gz |
add scheme integration to js via `require'
* module/language/ecmascript/impl.scm: Add <js-module-object>, that wraps
a module. Add js-require, a javascript-happy function that returns an
object that wraps a Guile module. Bind it to `require' in the default
environment.
Diffstat (limited to 'module/language/ecmascript/impl.scm')
-rw-r--r-- | module/language/ecmascript/impl.scm | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/module/language/ecmascript/impl.scm b/module/language/ecmascript/impl.scm index c31c29d73..1307a7f27 100644 --- a/module/language/ecmascript/impl.scm +++ b/module/language/ecmascript/impl.scm @@ -57,10 +57,36 @@ (define-method (prop-attrs (o <js-global-object>) (p <string>)) (prop-attrs o (string->symbol p))) +(define-class <js-module-object> (<js-object>) + (module #:init-form (js-module o) #:init-keyword #:module + #:getter js-module)) +(define-method (pget (o <js-module-object>) (p <string>)) + (pget o (string->symbol p))) +(define-method (pget (o <js-module-object>) (p <symbol>)) + (let ((v (module-variable (js-module o) p))) + (if v + (variable-ref v) + (next-method)))) +(define-method (pput (o <js-module-object>) (p <string>) v) + (pput o (string->symbol p) v)) +(define-method (pput (o <js-module-object>) (p <symbol>) v) + (module-define! (js-module o) p v)) +(define-method (prop-attrs (o <js-module-object>) (p <symbol>)) + (cond ((module-variable (js-module o) p) '()) + (else (next-method)))) +(define-method (prop-attrs (o <js-module-object>) (p <string>)) + (prop-attrs o (string->symbol p))) + +;; we could make a renamer, but having obj['foo-bar'] should be enough +(define (js-require modstr) + (make <js-module-object> #:module + (resolve-interface (map string->symbol (string-split modstr #\.))))) + (define (init-js-bindings! mod) (module-define! mod 'NaN +nan.0) (module-define! mod 'Infinity +inf.0) (module-define! mod 'undefined *undefined*) + (module-define! mod 'require js-require) ;; isNAN, isFinite, parseFloat, parseInt, eval ;; decodeURI, decodeURIComponent, encodeURI, encodeURIComponent ;; Object Function Array String Boolean Number Date RegExp Error EvalError |