- From: <bugzilla@wiggum.w3.org>
- Date: Mon, 18 Jul 2005 05:21:35 +0000
- To: public-qt-comments@w3.org
- Cc:
http://www.w3.org/Bugs/Public/show_bug.cgi?id=1705 Summary: [FS] technical: 5.2 Module Declaration: cyclical imports Product: XPath / XQuery / XSLT Version: Last Call drafts Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: Formal Semantics AssignedTo: simeon@us.ibm.com ReportedBy: jmdyck@ibiblio.org QAContact: public-qt-comments@w3.org 5.2 Module Declaration "Note that the rule above and the rules for static/dynamic processing of an "import module" declaration in [5.11 Module Import] are mutually recursive." Yes, and it seems to me that if you attempt to perform SCP or DCP on cyclically-importing library modules, the inference will not terminate. Consider the simplest case: main module M imports namespace N, which is the target namespace of library module L, which also imports its own target namespace N (explicitly allowed by XQuery 4.11). SCP of M's "import module N" relies on N =>module_statEnv statEnv1 which relies on L =>stat statEnv which involves SCP of L's "import module N", which relies on N =>module_statEnv statEnv1 etc. To handle this, I think you need another phase (call it Export Context Processing), a cursory version of SCP: Go through the Prolog, collecting all the "exportable" items (variables and their types, functions and their signatures). You might call the result an "export environment". The important thing is that this phase can skip over module imports, so it doesn't care about import-cycles. Some overarching mechanism would then be responsible for performing ECP on all library modules (of interest), and then using the resulting export environments to perform SCP on them all (wherein a module import simply pulls in the appropriate export environments). The only snag is that if a variable is declared without a type, its type must be inferred, which requires that its initializing expression be normalized and type-analyzed, which could involve imported variables or functions, and thus could not be done with the limited information available in ECP. For instance consider the two modules: -------- module namespace L1 = "http://www.example.com/foo"; import module namespace L2 = "http://www.example.com/foo"; declare variable $L1:s1 = $L2:s2; declare variable $L1:d1 = 10.0; -------- module namespace L2 = "http://www.example.com/foo"; import module namespace L1 = "http://www.example.com/foo"; declare variable $L2:d2 = $L1:d1; declare variable $L2:s2 = "foo"; -------- Note that there is no circularity involved in evaluating the variables: $s1 = $s2 = "foo" $d2 = $d1 = 10.0 so err:XQST0054 is not applicable. (Or maybe it is; depends on what "circularity" means.) But just inferring their types seems pretty tricky. Perhaps you need to require that, in a library module, a variable declaration must have an explicit type. Or if that's too restrictive, say it can omit the type as long as the initializing expression doesn't depend on imported variables or functions. Or if that's still too restrictive, say it can't depend on variables or functions defined in another library module with the same target namespace. Or maybe just say that if an initializing expression cannot be statically typed because of a circularity, then that's an error too.
Received on Monday, 18 July 2005 05:24:54 UTC