whalesong/lang/js-impl/query.rkt
2011-05-27 16:30:12 -04:00

40 lines
1.1 KiB
Racket

#lang racket/base
(require racket/contract
racket/runtime-path
racket/list
syntax/modresolve)
(define-struct js-module (impls exports))
(provide/contract [query
(module-path? . -> . (or/c js-module? false/c))]
[struct js-module ([impls (listof string?)]
[exports (listof symbol?)])])
(define-runtime-path record.rkt "record.rkt")
(define ns (make-base-empty-namespace))
;; query: module-path -> (listof string)
;; Given a module, see if it's implemented via Javascript.
(define (query a-module-path)
(let ([resolved-path (resolve-module-path a-module-path #f)])
(parameterize ([current-namespace ns])
(dynamic-require a-module-path (void)) ;; get the compile-time code running.
(let ([result
((dynamic-require-for-syntax record.rkt 'lookup-implementations) resolved-path)])
(cond
[(empty? result)
#f]
[else
(make-js-module result
((dynamic-require-for-syntax record.rkt 'lookup-exports) resolved-path))])))))