From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=AWL,SPF_NEUTRAL autolearn=disabled version=3.1.3 Received: from discorde.inria.fr (discorde.inria.fr [192.93.2.38]) by yquem.inria.fr (Postfix) with ESMTP id 7F120BC69 for ; Thu, 10 May 2007 15:13:43 +0200 (CEST) Received: from wr-out-0506.google.com (wr-out-0506.google.com [64.233.184.237]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id l4ADDg79000489 for ; Thu, 10 May 2007 15:13:43 +0200 Received: by wr-out-0506.google.com with SMTP id l58so574212wrl for ; Thu, 10 May 2007 06:13:42 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:mime-version:content-type:content-transfer-encoding:content-disposition; b=ZXI+sTJcGm0ehjIcIguGrpZzgNhvFHIfixRm66QQsWxVlMM80Kex6924iZoSpSCjkTCcJ1lVgHQxsdgf5Naoz/7cl1gyI/mCWaDZIugHntPe/7ZK1TiAnzGG6CckRw2udyNvOGqUBxdq3BMewxHBTra6I31DwwX3rGyAOHLsN2g= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:mime-version:content-type:content-transfer-encoding:content-disposition; b=JcKQiQMhu6b4ZvVb0QqKINLBS61U46qRt2ipOKfCZYnFisgJLzT45pmWXInD6XVb3JXpYKmwZVfJG23LBRpnWUrpGyBEIQzc2uqxDfuMklt90o/69wJUZoKhzXZ7GvUZ8dXO5Zn46tKc9cGODndwmQMw7yu3FJG67dKxWhLPkj8= Received: by 10.114.53.1 with SMTP id b1mr500426waa.1178802821299; Thu, 10 May 2007 06:13:41 -0700 (PDT) Received: by 10.114.183.4 with HTTP; Thu, 10 May 2007 06:13:41 -0700 (PDT) Message-ID: Date: Thu, 10 May 2007 15:13:41 +0200 From: "Nicolas Pouillard" To: "Till Varoquaux" Subject: Building object types (Was: Abstract types in the revised syntax) Cc: "Caml List" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline X-j-chkmail-Score: MSGID : 46431A86.000 on discorde : j-chkmail score : X : 0/20 1 0.000 -> 1 X-Miltered: at discorde with ID 46431A86.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; syntax:01 ocaml:01 camlp:01 ctyp:01 cheers:01 camlp:01 ctyp:01 cheers:01 syntax:01 existential:01 existential:01 parser:01 syntaxes:01 bug:01 parser:01 On 5/3/07, Till Varoquaux wrote: > Nope, > > This doesn't work for me (using a cvs version of ocaml about 2hours > old). I ran in the exact same problem, maybe I was actually doing it > right :) Sorry for the late response... Are you on the release310 branch? > > camlp4orf test.ml > File "test.ml", line 6, characters 28-36: > While expanding quotation "ctyp": > Parse error: EOI expected after [quotation of type] (in [quotation of type]) > > cheers, > Till > On 5/3/07, Nicolas Pouillard wrote: > > On 5/3/07, Till Varoquaux wrote: > > > I happen to very much dislike dangling free variables and therefore > > > think this would be a nice improvement. > > > Thanks for fixing my constraint issues. > > > BTW I still haven't figured out how to generate constraints (lets say > > > I have a list of strings [t1,..,tn] and a list of idents [c1...cn], > > > how do I generate the type < c1:t1; ... ; cn:tn >? ) > > > > That way... > > > > open Camlp4.PreCast;; > > > > let mk_obj_type _loc fields types = > > let object_type = > > List.fold_right2 begin fun field typ object_type -> > > <:ctyp< $lid:field$ : $lid:typ$ ; $object_type$ >> > > end fields types <:ctyp<>> > > in > > <:ctyp< < $object_type$ > >> > > ;; > > > > mk_obj_type (Loc.mk "") ["f1"; "f2"] ["t1"; "t2"];; > > > > > > > > > > Cheers, > > > Till > > > > > > On 5/3/07, Nicolas Pouillard wrote: > > > > Hello, > > > > > > > > This message concern the few people that use the revised syntax :) > > > > > > > > In the revised syntax, abstract types are expressed by defining them > > > > with an unbound type variable: > > > > > > > > (* Original *) > > > > type t;; > > > > > > > > (* Revised *) > > > > type t = 'a; > > > > > > > > The motivation is that looks like an existential type, which is a way > > > > of seeing abstract types. > > > > > > > > However I found this motivation misapplied since it doesn't look like > > > > an existential type, there is no exists keyword?!? (type t = exists > > > > 'a. 'a;) > > > > > > > > It's like a hot-dog without sausage?!? > > > > > > > > In fact, consequences of that choice are worst. If forces the > > > > parser/printer to do some semantical operation to convert back and > > > > forth between syntaxes. > > > > > > > > type t 'a = 'a; (* not abstract *) > > > > > > > > type t 'a = 'b; (* abstract *) > > > > > > > > It was considered acceptable, since the test for the freeness of a > > > > single type variable seemed simple because very local. > > > > > > > > Indeed only the list of parameters was consulted to compute the > > > > freeness of the type variable. > > > > > > > > It seems very weak since highly dependent of future evolution of the language. > > > > > > > > Nowadays it's no longer sufficient. Constraints can be added with a > > > > type declaration to constrain the type of parameters. > > > > > > > > type c 'a = 'b > > > > constraint 'a = < b : 'b; .. >; > > > > (* Thanks to Till Varoquaux for it's bug report. *) > > > > > > > > Clearly I don't want to push that wrong choice further by making more > > > > semantic analysis in the parser/printer. > > > > > > > > So I revert back to << type t; >> for abstract types. > > > > > > > > Now, what's the new representation for abstract types. OCaml use a > > > > option type, where None represent the abstract type. We can't afford > > > > that, since we want a concrete syntax for everything. > > > > However we have a nil type that can be used as a default case (for > > > > lists of types or optional types). > > > > > > > > <:sig_item< type t >> === <:sig_item< type t = $ <:ctyp<>> $ >> > > > > > > > > Not that this will also concern abstract module types. > > > > > > > > Alas, this will affect existing code using the revised syntax, but > > > > will be easily caught at compilation. > > > > > > > > From a pragmatic point of view, a grep to show the usage of such types: > > > > grep -E "^[ \t]*type.*=[ \t]*'[^ \t]*[ \t]*;[ \t]*$" **/*.ml* > > > > > > > > Feel free to share your mind on that subject. The change is not yet > > > > applied to the CVS. > > > > > > > > Best regards, > > > > > > > > -- > > > > Nicolas Pouillard > > > > > > > > > > > > > -- > > Nicolas Pouillard > > > -- Nicolas Pouillard