Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!uwm.edu!uakari.primate.wisc.edu!ginosko!uunet!mcsun!ukc!edcastle!lfcs!nick
From: nick@lfcs.ed.ac.uk (Nick Rothwell)
Newsgroups: comp.lang.misc
Subject: Re: Header files
Message-ID: <512@castle.ed.ac.uk>
Date: 28 Sep 89 11:07:57 GMT
References: <24955@louie.udel.EDU>
Sender: root@castle.ed.ac.uk
Reply-To: nick@lfcs.ed.ac.uk (Nick Rothwell)
Organization: LFCS Enya Admiration Society
Lines: 49
In-reply-to: new@udel.EDU

In article <24955@louie.udel.EDU>, new@udel writes:
>One thing I have always liked about the C language was the separation
>between the "header" files (.h) and the "code" files (.c).

>Does anyone know of any relatively popular languages that allow this
>sort of separation other than C and C++?  If not, why not?
Discussion?

ML can do the same sort of thing:

	signature SMALL_PART =
	  sig
	    type ... and ... and ...
	    val ... : ty1 and ... : ty2 and ...
	  end;

	signature ANOTHER_SMALL_PART = ...

	signature ENTIRE_THING =
	  sig
	    include SMALL_PART
	    include ANOTHER_SMALL_PART
	  end

This gives you inclusion of interfaces. There's also nesting of
interfaces; the ENTIRE_THING signature could specify two sub-modules
with smaller signatures. The actual module to match ENTIRE_THING could
be a single object containing all the type specs and functions, or
could be built from two (or more) separate ones:

	functor EntireThing(structure Part1: SMALL_PART
			    structure Part2: ANOTHER_SMALL_PART
			   ) =
	  struct
	    open Part1		(* simple case: inclusion. *)
	    open Part2
	  end;

You can also have several implementations maching the same interface
of course (but you said you weren't interested in that).

>				 -- Darren

		Nick.
--
Nick Rothwell,	Laboratory for Foundations of Computer Science, Edinburgh.
		nick@lfcs.ed.ac.uk    !mcvax!ukc!lfcs!nick
~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
               Fais que ton reve soit plus long que la nuit.