Re: [MLton] RFC: implement "use" function to support explicit file dependency
James Deng <[email protected]> Sat, 8 Feb 2014 13:55:46 +1100
| Newsgroups | gmane.comp.lang.ml.mlton.devel |
|---|---|
| Message-ID | <[email protected]> |
On 8 Feb 2014, at 3:16 am, Matthew Fluet <[email protected]> wrote: > On Tue, Feb 4, 2014 at 8:10 PM, James Deng <[email protected]> wrote: >> I thought this mechanism can be implemented similar to that of the ML Basis >> system. Please point out if I am wrong. >> >> The mlb files are elaborated with the elaborateMLB function in the Elaborate >> phase. I guess this phase is able to combine and substitute all the “use” >> statements with file contents. (I assume the “use” is not a normal function, >> but a compile time meta-programming.) > > It is true that you could implement a limited form of file inclusion, > directly within an .sml file, in a manner that is somewhat similar to > the implementation of the ML Basis System. But, it would need to be > fairly restrictive ("use" is only applied to constant strings, "use" > is only applied at the top-level of the file), and it might be more > confusing to keep the name "use" for the feature. Yes. To simplify the implementation, “use” can be restricted to top-level. And using another term than “use” may be preferred to avoid confusion. > >> For instance, the semantics of this simple file A.sml: >> >> local >> use “B.sml”; >> use “C.sml”; >> in >> (* use B and C here. *) >> end >> >> >> is equivalent to a mlb file A.mlb: >> >> local >> B.sml >> C.sml >> in A.sml end >> > > Note that one couldn't simply interpret "use" as textual inclusion, > because SML does not allow signature and functor declarations within > local. But, that's a rather minor point. > > The major issue is that "use" is not really compositional in the > manner that one would like to express these sorts of dependencies. > The issue is that if both "B.sml" and "C.sml" rely on "D.sml", the > simplistic interpretation of "use" is that "D.sml" is > included/elaborated/evaluated twice. Furthermore, because of > generative types, "B.sml" and "C.sml" might end up incompatible in > some manner, because they see different type declarations from their > own inclusions of "D.sml". > > That's why the ML Basis System has a semantics where "Each MLB file is > elaborated and evaluated only once, with the result being cached. > Subsequent references use the cached value. Thus, any observable > effects due to evaluation are not duplicated if the MLB file is > referred to multiple times." In the ML Basis System, if both "B.mlb" > and "C.mlb" both reference "D.mlb", then "D.mlb" is > elaborated/evaluated only once, but the same environment is made > available in both "B.mlb" and "C.mlb”. The semantics of that “use” (or other terms) statement should be well designed, and possibly borrow a lot from the ML basis system. But one goal is easier and simpler approach than ML basis system. > > > That said, James's original point is well taken. One difficulty with > SML programming is that a single SML file is not, in some sense, > self-contained. It is very true that in most languages, if I see > something in a file that doesn't appear to be defined in the file, > then I jump to the top of the file and look at the "#include" (C/C++), > "import" (Java, Haskell), "open" (OCaml), etc. to see some amount > dependency information. The ML Basis System was designed to work with > this limitation of SML programming, and so the "implicit dependencies" > is not so much a "feature" in the sense of desirable as a "feature" in > the sense of a simple characteristic of the system. > I couldn’t agree with you more. Without explicit dependency information, I find it hard to follow SML source code. In addition, a self-contained source file approach opens a door for tools (IDE) to provide advanced features. > On the other hand, with the ML Basis System, one could program in a > style that exposes very explicit import and export dependency > information. One can adopt a style whereby every .sml file is > accompanied by a .mlb file that exactly explains its imports and > exports. Christopher Cramer mentioned that this is a style that he > has adopted: http://article.gmane.org/gmane.comp.lang.ml.mlton.user/1486. > With James's example above, we might write "A.mlb" with: > > ---------- > local > local > (* IMPORTS *) > local B.mlb in structure B1 structure B2 end (* "import" B1 and B2 > from B.mlb (which corresponds to B.sml) *) > local C.mlb in structure C end (* "import" C from C.mlb (which > corresponds to C.sml) *) > in > (* CODE *) > A.sml (* may reference B1, B2, and C (but nothing else) *) > end > in > (* EXPORTS *) > structure A1 > structure A2 > end > ---------- > > If one were to globally adopt this style, then it would be nice for > some compiler support, in the sense that we would like to push the > IMPORTS and EXPORTS into the A.sml file in some manner --- though it > would necessarily be some kind of extension over Standard ML: > > ---------- > import B.mlb (structure B1, structure B2) > import C.mlb (structure C) > export (structure A1, structure A2) > > ;; > > (* CODE *) > ---------- > > > Finally, I think it is a very good thing that SML (and most > programming-in-the-very-large systems layered on top of SML, such as > SML/NJ's Compilation Manager and MLton's ML Basis System) allow > individual .sml files to define multiple module-level constructs > (structures, signatures, functors). This is in contrast to a number > of other languages that require a one-to-one mapping of module-level > constructs to files. > Yes. I agree that the combination of first class modules in SML and the ML basis system is very powerful. But for daily use and toolchain support, I think a good simple (module hierarchy) convention is nice. Btw, I really like the simplicity of the Go’s package system and toolchain. I hope we can have such an equivalent for the elegant language SML, and that could lower the hurdles for beginners as well. > ------------------------------------------------------------------------------ > Managing the Performance of Cloud-Based Applications > Take advantage of what the Cloud has to offer - Avoid Common Pitfalls. > Read the Whitepaper. > http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg.clktrk > _______________________________________________ > MLton-devel mailing list > [email protected]; [email protected] > https://lists.sourceforge.net/lists/listinfo/mlton-devel ------------------------------------------------------------------------------ Managing the Performance of Cloud-Based Applications Take advantage of what the Cloud has to offer - Avoid Common Pitfalls. Read the Whitepaper. http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg.clktrk _______________________________________________ MLton-devel mailing list [email protected]; [email protected] https://lists.sourceforge.net/lists/listinfo/mlton-devel