[MLton] extended basis library
Daniel C. Wang
danwang at CS.Princeton.EDU
Wed Oct 25 20:00:41 PDT 2006
This issue reminded me of my orphaned "dtangle" project
http://www.cs.princeton.edu/~danwang/dtangle
http://www.cs.princeton.edu/~danwang/dtangle/main.pdf
I never compiled it with MLton, but I'm happy to help someone else
figure it out.. but it's been a long while since I touched the code!
However, it is well commented :)
Vesa Karvonen wrote:
> Stephen Weeks wrote:
>
>> Comment style
>> ----------------------------------------
>> I saw a couple of commenting conventions that I liked. I was
>> wondering if they were aimed at automatic extraction of documentation,
>> and also if we should establish them as conventions.
>>
>
> Yes, the conventions are aimed at automatic extraction, but are also
> intended to look readable on their own. The conventions would obviously
> be more useful if there were a tool that would check their syntax and
> generate documentation from them. We'll get there eventually :). At any
> rate, changing comment decorations to suit the tool that we'll adopt at
> some point is a minor effort compared to writing the documentation
> comments in the first place.
>
> [...]
>
>> Second was the convention of following specifications in signature
>> with the comment.
>>
>> val intIso : (char, Int.int) iso
>> (**
>> * The isomorphism between characters and character codes. It
>> * always equals {(ord, chr)}. Note that the projection part of the
>> * isomorphism, namely {chr}, is likely to be a partial function.
>> *)
>>
>> The MLton style has typically put the comment before the spec, which I
>> think is a mistake.
>>
>
> Yes, I think that putting the comment after type and val specs has the
> advantage that the spec itself essentially becomes a natural part of the
> comment (or documentation).
>
>
>> Formatting
>> ----------------------------------------
>> The code is indented/layed-out in the MLton style, e.g.
>>
>> signature ISO =
>> sig
>> type ('a, 'b) iso = ...
>> ...
>> end
>>
>> [...] I prefer the C-brace style
>>
>> signature ISO = sig
>> type ('a, 'b) iso = ...
>>
> ...
>
>> end
>>
> [...]
>
>> The advantage of this style is that it saves vertical space (no big
>> deal) and indentation nesting (a big win).
>>
>
> I kind of like the MLton-style better, because, IMO, it better reflects
> the structure of the language. (In C the braces in named definitions are
> part of the named definition and there are no corresponding anonymous
> forms.) But I've also noticed the issue with excessive indentation, which
> gets pretty bad for substructures. OTOH, I also dislike the exception to
> omit indentation when a top-level module declaration is in its own file.
> So, perhaps the C-brace style is a practical compromise. (As you probably
> noticed already, I switched to the C-brace style.) At any rate, I don't
> think that we should mandate any specific indentation style, but strongly
> recommend using using some consistent style within a library. In the long
> run, we should have a documentation extractor which means that library
> users don't necessarily have to browse the source code.
>
>
>> Naming convention for functors
>> ----------------------------------------
>> I don't see the point of prefixing functors with "Mk". It seems
>> redundant, as of course a functor is making a new structure. Dropping
>> the "Mk" doesn't create a naming conflict, as functors have their own
>> namespace. Also, there is no conflict in filenames as functors get a
>> different suffix (.fun).
>>
>
> Well, I think that having separate namespaces for functors and structures
> is a mistake in SML. In Alice ML functors and structures share the same
> namespace. So, using the same names for functors and structures makes the
> code slightly more difficult to translate to Alice ML and potentially other
> SML like languages with higher-order functors. At any rate, those
> particular functors are not supposed to be exposed from the library, so it
> should be possible to change their names at any time without breaking
> compatibility. So, I'll leave the names as they are for now.
>
>
>> Avoiding copying in MonoVector.{from,to}Poly
>> --------------------------------------------
>> One could almost use the following implementation of toPoly.
>>
>> fun toPoly v =
>> if MLton.isMLton then
>> v
>> else
>> Vector.tabulate (length v, fn i => sub (v, i))
>>
>> It doesn't quite work because MLton hides the equivalence between the
>> two types. It would be worth exporting something in the MLton
>> structure to expose the equivalence so that one could avoid the copy.
>>
>
> Indeed. Is there some reason why the equivalences between polymorphic and
> monomorphic vectors (and likewise for arrays) aren't exposed? I haven't
> noticed anything in the basis library manual that would disallow it. I
> would guess that the main reason to not expose the equivalences is to avoid
> exposing an implementation detail that might change.
>
>
>> One might worry that the use of the nonstandard "MLton.isMLton" makes
>> the code less portable. But I don't think it's any worse than the use
>> of MLBs, Int64, etc.. In the end we will have to decide how much
>> effort we're willing to spend to implement code for other SML
>> compilers. I'd like to do the best we can for MLton users, think of
>> the extended basis as a spec, and leave to other compilers to figure
>> out the best way to implement the spec in their compiler.
>>
>
> You've probably noticed that the names of some of the extended basis lib sml
> files have '-mlton' in them. The idea is that compiler specific code
> lives in separate files for each compiler. When/if it becomes possible to
> implement the optimization on MLton, I plan to restructure the code so
> that the toPoly/fromPoly functions are implemented in their own file that
> then becomes compiler specific. Porting to a new compiler should then
> mean just adding new files files to the library.
>
> I've also thought about having a MLB path variable, say "COMPILER", to
> name the compiler. Then MLB file snippets like
>
> (* Extended real modules *)
> local
> mk-real-ext.fun
> in
> real.sig
> reals-mlton.sml
> end
>
> would be changed to
>
> (* Extended real modules *)
> local
> mk-real-ext.fun
> in
> real.sig
> reals-$(COMPILER).sml
> end
>
> and it might then be possible to use the same MLB file on all compilers
> that support the ML Basis System.
>
>
>> MLB convention
>> ----------------------------------------
>> A useful convention in MLBs is to use an export filter to specify what
>> the MLB exports. This is analogous to using a signature to specify
>> what a structure exports. It nicely collects in one place all of the
>> exports, making it easier for a reader to understand at a glance. It
>> is also easier than trying to carefully hide unwanted exports in a
>> number of "local"s. Finally, it serves as a check that the code
>> really does export everything that you want.
>>
>
> I agree that using export filters has some nice properties, but I'm not
> entirely sold on the idea just yet. It means that to add new things one
> has to change more lines. OTOH, I guess you'll get more accurate compiler
> warnings for unused things in return. I'll have to think about this.
>
> In the meanwhile, I think that it would nice if, in addition to
> -show-basis, MLton would have an option, say -show-basis-summary, that
> would only show the kinds (type, val, signature, structure, ...) and names
> of all exported top-level bindings (IOW, it would essentially output an
> export filter). I think that such an option would make it easier to maintain
> such export filters as well as helpful in understanding MLBs. It might also
> be useful to show the infix status of identifiers in -show-basis output.
>
> Thanks for the comments!
>
> -Vesa Karvonen
>
> _______________________________________________
> MLton mailing list
> MLton at mlton.org
> http://mlton.org/mailman/listinfo/mlton
>
More information about the MLton
mailing list