summaryrefslogtreecommitdiff
path: root/module
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-02-22 11:55:20 +0100
committerAndy Wingo <wingo@pobox.com>2009-02-22 11:55:20 +0100
commit143177ed9ee93a2b8df326c431ef09de06ca8063 (patch)
tree73f92913a4dcad5cc6259260cee407d4be2616be /module
parenta3e34104db5eded9e48f527ef54fe6c8d18a07f8 (diff)
downloadguile-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')
-rw-r--r--module/language/ecmascript/impl.scm26
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