trying to parse modules

This commit is contained in:
Danny Yoo 2011-05-10 21:28:28 -04:00
parent d1f2f6b277
commit 5cd3ef8cd8
3 changed files with 70 additions and 14 deletions

View File

@ -14,20 +14,12 @@
reset-lam-label-counter!/unit-testing) reset-lam-label-counter!/unit-testing)
;; The module-path-index of self is:
(define self-idx (module-path-index-join #f #f))
(define (self-idx? mpi) ;; current-module-path-index-resolver: (module-path-index ModuleName -> ModuleName) -> void
(let-values ([(path subpath)
(module-path-index-split mpi)])
(eq? path #f)))
;; current-module-path-index-resolver: (module-path-index -> ModuleName) -> void
;; The module path index resolver figures out how to translate module path indices to module names. ;; The module path index resolver figures out how to translate module path indices to module names.
(define current-module-path-index-resolver (define current-module-path-index-resolver
(make-parameter (make-parameter
(lambda (an-mpi) (lambda (mpi relative-to)
(error 'current-module-path-index-resolver)))) (error 'current-module-path-index-resolver))))
@ -124,7 +116,7 @@
[(module-variable? a-toplevel) [(module-variable? a-toplevel)
(let ([resolver (current-module-path-index-resolver)]) (let ([resolver (current-module-path-index-resolver)])
(make-ModuleVariable (module-variable-sym a-toplevel) (make-ModuleVariable (module-variable-sym a-toplevel)
(resolver self-idx (module-variable-modidx a-toplevel))))])) (resolver (module-variable-modidx a-toplevel) #f)))]))
;; parse-form: form -> (U Expression) ;; parse-form: form -> (U Expression)
@ -211,12 +203,11 @@
[(struct mod (name srcname self-modidx prefix provides requires [(struct mod (name srcname self-modidx prefix provides requires
body syntax-body unexported max-let-depth dummy lang-info body syntax-body unexported max-let-depth dummy lang-info
internal-context)) internal-context))
(let ([resolver (current-module-path-index-resolver)])
(make-Module (make-ModuleName name) (make-Module (make-ModuleName name)
(parse-prefix prefix) (parse-prefix prefix)
(parse-mod-requires self-modidx requires) (parse-mod-requires self-modidx requires)
(parse-mod-provides provides) (parse-mod-provides provides)
(parse-mod-body body)))])) (parse-mod-body body))]))
;; parse-mod-requires: module-path-index (listof (pair (U Integer #f) (listof module-path-index))) -> (listof ModuleName) ;; parse-mod-requires: module-path-index (listof (pair (U Integer #f) (listof module-path-index))) -> (listof ModuleName)
@ -229,7 +220,8 @@
empty] empty]
[(= (car (first requires)) [(= (car (first requires))
0) 0)
(map (lambda (m) (resolver enclosing-module-path-index m)) (map (lambda (m) (resolver m
(resolver enclosing-module-path-index #f)))
(cdr (first requires)))] (cdr (first requires)))]
[else [else
(loop (rest requires))])))) (loop (rest requires))]))))

View File

@ -308,6 +308,11 @@
(make-App (make-ToplevelRef 0 1) '()))))) (make-App (make-ToplevelRef 0 1) '())))))
;; Compiling modules
(run-my-parse #'(module foo racket/base
42))
;; make sure we don't see an infinite loop ;; make sure we don't see an infinite loop
#;(run-zo-parse #'(letrec ([g (lambda () (g))]) #;(run-zo-parse #'(letrec ([g (lambda () (g))])

59
typed-module-path.rkt Normal file
View File

@ -0,0 +1,59 @@
#lang typed/racket/base
(define-type RelativeString String)
(define-type UserString String)
(define-type PackageString String)
(define-type ResolvedModulePath (U Path Symbol))
(define-type ModulePath (U (List 'quote Symbol)
RelativeString
(Pairof 'lib (Pairof RelativeString (Listof RelativeString)))
Symbol
(List 'file String)
(List 'planet Symbol)
(List 'planet String)
(Pairof 'planet
(Pairof RelativeString
(Pairof (U (List UserString PackageString)
(List UserString PackageString Natural)
(List UserString PackageString Natural MinorVersion))
(Listof RelativeString))))))
(define-type MinorVersion (U Natural
(List Natural Natural)
(List '= Natural)
(List '+ Natural)
(List '- Natural)))
(require/typed racket/base
[opaque ModulePathIndex module-path-index?]
[module-path-index-resolve
(ModulePathIndex -> Path-String)]
[module-path-index-join
((U ModulePath #f)
(U ModulePathIndex ResolvedModulePath #f) ->
ModulePathIndex)]
[module-path-index-split
(ModulePathIndex -> (values (U ModulePath #f)
(U ModulePathIndex ResolvedModulePath #f)))])
(provide
ModulePath
ResolvedModulePath
ModulePathIndex
module-path-index-resolve
module-path-index-join
module-path-index-split)