Article View: fa.caml
Article #57RE: [Caml-list] automatic extaction of the .mli (and a little more) from the .ml
From: David Allsopp
Date: Tue, 04 Jun 2013 09:05
Date: Tue, 04 Jun 2013 09:05
90 lines
8707 bytes
8707 bytes
Romain Bardou wrote: > Le 04/06/2013 09:53, David Allsopp a �crit : > > Romain Bardou wrote: > >> I also used to believe the .mli file should be somehow included in > >> the .ml file. Now I don't. > > > > +1, FWIW! It's easy to start without the .mli when prototyping and then > add it as things mature. > > > >> But if you design such a tool, here are some things to consider. > >> > >> - Using numbers to order stuff creates some issues of scalability. In > >> particular, inserting a declaration between #3 and #4 may require you > >> to move #4 to #5, #5 to #6 and so on, which (in particular if > >> everything is not in the right order in the implementation) can prove > >> more annoying than reordering stuff in an .mli. > > > > This is horrible, IMO - any design decision which looks like it'll > *require* refactoring support from an editor to be able to work with it > strikes me as a bad design decision. If you have hundreds of these in a > file, at some point you'll need a "renumber everything" macro. > > Agreed, obviously. It seems Fran�ois proposes floats as a solution, but > while it does allow you to insert without renumbering everything, it seems > that with time, you'd end up with a messy file. Yes - I'd said in a private exchange that using floats is no different from the way Basic programmers used to leave gaps between line numbers! Eventually you need to renumber... > > I have wondered if this problem is perhaps looked at the wrong way > around - in other words, the complaint takes the form "how can we export > to the .mli file automatically" rather than "how can we *import* from the > .ml file automatically". The thing I do find irritating maintaining > .mli/.ml files is having to type anything out twice - and for the most > part that means fully exported type declarations. Say you have a simple > module: > > I agree with the idea of looking the other way around, but I'm not sure I > agree with your proposal, which seems to *not* be the other way > around: in your example, you write "type t from implementation", in the > .mli. I would prefer "type t from interface" from the .ml. My perspective was that it looks at what we write in the .ml file being *exported* to the .mli file and I was proposing that what we write in the .mli file be *imported* from the .ml file (which I would say is indeed the other way around). But as I said in response to Alain, perhaps that's not actually the good idea I thought it was, given that .mli files are used in contexts where the .ml file isn't available. I agree that putting the copy statement in the .ml file is better. > Also, I agree that val and let is not duplication as long as the let is > not annotated. Duplication comes from types and module type declarations, > exceptions, and maybe also classes. > > Regarding val and let, if the types don't match, the error is better > located than before in recent versions of OCaml. But it could be even > better if the let could be retyped with inlined type annotations. > > Here is an example: > > val f: int -> int > > let f x = x +. 1. > > The error is located on f (it has type float -> float instead of int -> > int). But maybe it would be better if it was located on x or +. as if the > function was actually written like this: > > let f (x: int): int = x +. 1. > > Why do I bring that up? Well this would go in the sense of avoiding > duplication by avoiding the need of adding the type annotations yourself > to get better error location. I guess that depends on what you regard as the error, though - the definition of [f] with floats is not incorrect, it just doesn't comply with the signature you've imposed. Personally, I'm happy with the idea that the compiler reports that the signature of [f] differs between the implementation and interface and leaves me to figure out why that's a mistake, but... > But this brings up other questions, such as: what if a function f is > polymorphic in the implementation and used as such, but is exported as a > monomorphic instance: if you import type annotations from the .mli, you > cannot use the polymorphism of f in the implementation anymore. Unless the > type annotations are only used to obtain better error messages, only when > there is a type mismatch between the mli and the ml. That's kind of why I was thinking that you only have an "extension" for types which are *actually* duplicated between the two. However, perhaps it's something that is relatively easy with the kind of extension Alain proposes so that you could write in the .ml file: let [%unify_typedef] f = x +. 1. so that you're saying that the type of [f] must be unifiable (rather than copied) from the .mli... which would catch the case of f : float -> float and state that either [+.] or [x] is the problem but also allow you to have a polymorphic function in the implementation with a monomorphic exported type. David -- Caml-list mailing list. Subscription management and archives: https://sympa.inria.fr/sympa/arc/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs
Technical Details
Message-ID:
<fa.htgBNyxD28HgM2WUNCtLGYDKh1Y@ifi.uio.no>Path:
arc1-ca.pugleaf.net!bp1ni803pbd.1!nntp.google.com!npeer03.iad.highwinds-media.com!feed-me.highwinds-media.com!cyclone03.ams2.highwinds-media.com!news.highwinds-media.com!voer-me.highwinds-media.com!newsfeed.eweka.nl!eweka.nl!feeder3.eweka.nl!news.unit0.net!uio.no!nntp.uio.no!.POSTED!not-for-mailReferences:
<fa.ysPYFL5+u0NnfGu8UBtNleD9SeQ@ifi.uio.no> <fa.bD6TGMY7hcijji7TE20fgVNMYJ0@ifi.uio.no> <fa.kLitjS6+thDvPu069t19jM9fjnc@ifi.uio.no> <fa.1Prz+i/q1iTOfA4HYPhd0lmmYco@ifi.uio.no> <fa.TXTBzzTqj63EPYGcArMMbZ/jQyI@ifi.uio.no>Show Full Headers
Complete Article Headers
X-Google-Thread: c0fe4b917e,bcac4a6e27ff55dd
X-Google-Attributes: gidc0fe4b917e,public,usenet
X-Google-NewGroupId: yes
X-Google-Language: ENGLISH,ASCII
X-Received: by 10.66.221.42 with SMTP id qb10mr3778054pac.37.1370336734220;
Tue, 04 Jun 2013 02:05:34 -0700 (PDT)
Path: arc1-ca.pugleaf.net!bp1ni803pbd.1!nntp.google.com!npeer03.iad.highwinds-media.com!feed-me.highwinds-media.com!cyclone03.ams2.highwinds-media.com!news.highwinds-media.com!voer-me.highwinds-media.com!newsfeed.eweka.nl!eweka.nl!feeder3.eweka.nl!news.unit0.net!uio.no!nntp.uio.no!.POSTED!not-for-mail
From: David Allsopp <dra-news@metastack.com>
Newsgroups: fa.caml
Subject: RE: [Caml-list] automatic extaction of the .mli (and a little more)
from the .ml
Date: Tue, 04 Jun 2013 09:05:33 UTC
Organization: MetaStack Solutions Ltd.
Lines: 90
Sender: caml-list-request@inria.fr
Message-ID: <fa.htgBNyxD28HgM2WUNCtLGYDKh1Y@ifi.uio.no>
References: <fa.ysPYFL5+u0NnfGu8UBtNleD9SeQ@ifi.uio.no> <fa.bD6TGMY7hcijji7TE20fgVNMYJ0@ifi.uio.no> <fa.kLitjS6+thDvPu069t19jM9fjnc@ifi.uio.no> <fa.1Prz+i/q1iTOfA4HYPhd0lmmYco@ifi.uio.no> <fa.TXTBzzTqj63EPYGcArMMbZ/jQyI@ifi.uio.no>
NNTP-Posting-Host: mail-jess.uio.no
Mime-Version: 1.0
X-Trace: readme.uio.no 1370336733 5858 129.240.7.9 (4 Jun 2013 09:05:33 GMT)
X-Complaints-To: abuse@uio.no
NNTP-Posting-Date: Tue, 4 Jun 2013 09:05:33 +0000 (UTC)
To: "caml-list@inria.fr" <caml-list@inria.fr>
X-IronPort-AV: E=Sophos;i="4.87,798,1363129200";
d="scan'208";a="20211581"
X-Original-To: caml-list@sympa.inria.fr
Delivered-To: caml-list@sympa.inria.fr
X-IronPort-Anti-Spam-Filtered: true
X-IronPort-Anti-Spam-Result: AlsAAHOtrVFRZ90wlGdsb2JhbABZgmi8coJogQIWDgEBAQEHDQkJFAMeB4IjAQEBAwEnVwsCAQgYCiQyJQIEGxOHbAcDvSaOdTiCd2EDiGiLBYNRkxiBN4In
X-IPAS-Result: AlsAAHOtrVFRZ90wlGdsb2JhbABZgmi8coJogQIWDgEBAQEHDQkJFAMeB4IjAQEBAwEnVwsCAQgYCiQyJQIEGxOHbAcDvSaOdTiCd2EDiGiLBYNRkxiBN4In
X-IronPort-AV: E=Sophos;i="4.87,798,1363129200";
d="scan'208";a="20211521"
Thread-Topic: [Caml-list] automatic extaction of the .mli (and a little
more) from the .ml
Thread-Index: AQHOXbEfSaBAF3FKQU2pLmZI8Q/+85kexO87///+Z4CAAC3YAIAGQFww///7mgCAABoa4A==
In-Reply-To: <51ADA3C2.7020302@inria.fr>
Accept-Language: en-GB, en-US
x-originating-ip: [172.16.0.18]
X-Scanned-By: MIMEDefang 2.65 on 172.16.0.20
X-Cloudmark-Analysis: v=1.1 cv=GaEGOwq9FwezmTggA+b6yC6zDZF2HYaK6RN/tSqdnVA= c=1 sm=0 a=IXlcok0kcmcA:10 a=WqH6JILulzsA:10 a=cTs9vV391PwA:10 a=8nJEP1OIZ-IA:10 a=xqWC_Br6kY4A:10 a=Djb2HxWtbS_48nti7MsA:9 a=wPNLvfGTeEIA:10 a=HpAAvcLHHh0Zw7uRqdWCyQ==:117
X-Sequence: 6887
X-no-archive: yes
List-Id: <caml-list.inria.fr>
List-Archive: <http://sympa.inria.fr/sympa/arc/caml-list>
List-Help: <mailto:sympa_inria@inria.fr?subject=help>
List-Owner: <mailto:caml-list-request@inria.fr>
List-Post: <mailto:caml-list@inria.fr>
List-Subscribe: <mailto:sympa_inria@inria.fr?subject=subscribe%20caml-list>
List-Unsubscribe: <mailto:sympa_inria@inria.fr?subject=unsubscribe%20caml-list>
Original-Date: Tue, 4 Jun 2013 09:05:13 +0000
Original-Message-Id: <E51C5B015DBD1348A1D85763337FB6D9CC7F4CA8@Remus.metastack.local>
Original-References: <51A81C67.50902@riken.jp> <87bo7rogub.fsf@gmail.com>
<51A84283.80309@riken.jp> <51A868F8.9050101@inria.fr>
<E51C5B015DBD1348A1D85763337FB6D9CC7F39B8@Remus.metastack.local>
<51ADA3C2.7020302@inria.fr>
X-Received-Bytes: 8336
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
Content-Language: en-US