add experimental support for "phaseless" modules

The intent is to support phase-crossing data such as the `exn:fail:syntax'
structure type that is instantiaed by macros and recognized by contexts
that use `eval' or `expand'. Phaseless modules are highly constrained,
however, to avoid new cross-phase channels, and a module is inferred to
be phaseless when it fits syntactic constraints.

I've adjusted `racket/kernel' and improved its documentation a little
so that it can be used to implement a phaseless module (which can
import only from other phaseless modules).

This change also adds a `flags' field to the `mod' structure type
from `compiler/zo-structs'.

original commit: 899a3279c2
This commit is contained in:
Matthew Flatt 2013-02-26 14:14:52 -07:00
parent 0deb045dde
commit e97bb74005
7 changed files with 11 additions and 6 deletions

View File

@ -185,11 +185,12 @@
(define (decompile-module mod-form orig-stack stx-ht mod-name) (define (decompile-module mod-form orig-stack stx-ht mod-name)
(match mod-form (match mod-form
[(struct mod (name srcname self-modidx prefix provides requires body syntax-bodies unexported [(struct mod (name srcname self-modidx prefix provides requires body syntax-bodies unexported
max-let-depth dummy lang-info internal-context pre-submodules post-submodules)) max-let-depth dummy lang-info internal-context flags pre-submodules post-submodules))
(let-values ([(globs defns) (decompile-prefix prefix stx-ht)] (let-values ([(globs defns) (decompile-prefix prefix stx-ht)]
[(stack) (append '(#%modvars) orig-stack)] [(stack) (append '(#%modvars) orig-stack)]
[(closed) (make-hasheq)]) [(closed) (make-hasheq)])
`(,mod-name ,(if (symbol? name) name (last name)) .... `(,mod-name ,(if (symbol? name) name (last name)) ....
,@(if (null? flags) '() (list `(quote ,@flags)))
,@(let ([l (apply ,@(let ([l (apply
append append
(for/list ([req (in-list requires)] (for/list ([req (in-list requires)]

View File

@ -114,7 +114,7 @@
(match mod-form (match mod-form
[(struct mod (name srcname self-modidx mod-prefix provides requires body syntax-bodies [(struct mod (name srcname self-modidx mod-prefix provides requires body syntax-bodies
unexported mod-max-let-depth dummy lang-info internal-context unexported mod-max-let-depth dummy lang-info internal-context
pre-submodules post-submodules)) flags pre-submodules post-submodules))
(define toplevel-offset (length (prefix-toplevels top-prefix))) (define toplevel-offset (length (prefix-toplevels top-prefix)))
(define topsyntax-offset (length (prefix-stxs top-prefix))) (define topsyntax-offset (length (prefix-stxs top-prefix)))
(define lift-offset (prefix-num-lifts top-prefix)) (define lift-offset (prefix-num-lifts top-prefix))

View File

@ -34,6 +34,7 @@
lang-info lang-info
#t #t
empty empty
empty
empty))])) empty))]))
(provide/contract (provide/contract

View File

@ -137,7 +137,7 @@
(match mod-form (match mod-form
[(struct mod (name srcname self-modidx prefix provides requires body syntax-bodies [(struct mod (name srcname self-modidx prefix provides requires body syntax-bodies
unexported max-let-depth dummy lang-info internal-context unexported max-let-depth dummy lang-info internal-context
pre-submodules post-submodules)) flags pre-submodules post-submodules))
(define new-prefix prefix) (define new-prefix prefix)
; Cache all the mpi paths ; Cache all the mpi paths
(for-each (match-lambda (for-each (match-lambda
@ -154,7 +154,7 @@
(begin (log-debug (format "[~S] lang-info : ~S" name lang-info)) ; XXX Seems to always be #f now (begin (log-debug (format "[~S] lang-info : ~S" name lang-info)) ; XXX Seems to always be #f now
(list (make-mod name srcname self-modidx new-prefix provides requires body empty (list (make-mod name srcname self-modidx new-prefix provides requires body empty
unexported max-let-depth dummy lang-info internal-context unexported max-let-depth dummy lang-info internal-context
empty empty))) empty empty empty)))
(begin (log-debug (format "[~S] Dropping module @ ~S" name phase)) (begin (log-debug (format "[~S] Dropping module @ ~S" name phase))
empty))))] empty))))]
[else (error 'nodep-module "huh?: ~e" mod-form)])) [else (error 'nodep-module "huh?: ~e" mod-form)]))

View File

@ -995,7 +995,7 @@
(define (convert-module mod-form) (define (convert-module mod-form)
(match mod-form (match mod-form
[(struct mod (name srcname self-modidx prefix provides requires body syntax-bodies unexported [(struct mod (name srcname self-modidx prefix provides requires body syntax-bodies unexported
max-let-depth dummy lang-info internal-context pre-submodules post-submodules)) max-let-depth dummy lang-info internal-context flags pre-submodules post-submodules))
(let* ([lookup-req (lambda (phase) (let* ([lookup-req (lambda (phase)
(let ([a (assq phase requires)]) (let ([a (assq phase requires)])
(if a (if a
@ -1091,6 +1091,7 @@
[l (cons lang-info l)] ; lang-info [l (cons lang-info l)] ; lang-info
[l (cons (map convert-module post-submodules) l)] [l (cons (map convert-module post-submodules) l)]
[l (cons (map convert-module pre-submodules) l)] [l (cons (map convert-module pre-submodules) l)]
[l (cons (if (memq 'phaseless flags) #t #f) l)]
[l (cons self-modidx l)] [l (cons self-modidx l)]
[l (cons srcname l)] [l (cons srcname l)]
[l (cons (if (pair? name) (car name) name) l)] [l (cons (if (pair? name) (car name) name) l)]

View File

@ -251,7 +251,7 @@
(define (read-module v) (define (read-module v)
(match v (match v
[`(,submod-path [`(,submod-path
,name ,srcname ,self-modidx ,name ,srcname ,self-modidx ,phaseless?
,pre-submods ,post-submods ,pre-submods ,post-submods
,lang-info ,functional? ,et-functional? ,lang-info ,functional? ,et-functional?
,rename ,max-let-depth ,dummy ,rename ,max-let-depth ,dummy
@ -337,6 +337,7 @@
dummy dummy
lang-info lang-info
rename rename
(if phaseless? '(phaseless) '())
(map read-module pre-submods) (map read-module pre-submods)
(map read-module post-submods))]))])) (map read-module post-submods))]))]))
(define (read-module-wrap v) (define (read-module-wrap v)

View File

@ -139,6 +139,7 @@
[dummy toplevel?] [dummy toplevel?]
[lang-info (or/c #f (vector/c module-path? symbol? any/c))] [lang-info (or/c #f (vector/c module-path? symbol? any/c))]
[internal-context (or/c #f #t stx? (vectorof stx?))] [internal-context (or/c #f #t stx? (vectorof stx?))]
[flags (listof (or/c 'phaseless))]
[pre-submodules (listof mod?)] [pre-submodules (listof mod?)]
[post-submodules (listof mod?)])) [post-submodules (listof mod?)]))