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.2 required=5.0 tests=AWL,SPF_NEUTRAL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from discorde.inria.fr (discorde.inria.fr [192.93.2.38]) by yquem.inria.fr (Postfix) with ESMTP id A30F1BC6B for ; Mon, 19 Mar 2007 17:37:56 +0100 (CET) Received: from wr-out-0506.google.com (wr-out-0506.google.com [64.233.184.235]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id l2JGbtIR004722 for ; Mon, 19 Mar 2007 17:37:56 +0100 Received: by wr-out-0506.google.com with SMTP id i31so1385368wra for ; Mon, 19 Mar 2007 09:37:54 -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:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=Tiwn2ttGGD1sjez+c9mOYa+ekClfKOP+rNA3Q0MAHVwy2bEPo47DEK8djhrPZP8HXcGZlb5UdpeFXUcfkTzCNT/LLKJ+t4Me1OmYeYPG03qBtU7ReQzh7A17/olyYzmLbim353mbhEdZvkqmQ/ED4hsIvrzXizmnNIG0Q9BFRXE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=IhQJnRIkLMnvIT0HztXySgl4cuP6nRpB3JvWv3+vA/AF9vWQ4LgxjQRbFYAYg6LfODqWqw+VRQhpV1apL6DFFplTm977IvPmyaTzNqaWhSK4bkKtYlgkNPytAHVYzYKI58IsK+qUI2IG3raHlx0R+1inBXr6ZgF5vKJijmGZgK0= Received: by 10.90.115.9 with SMTP id n9mr4282426agc.1174322273989; Mon, 19 Mar 2007 09:37:53 -0700 (PDT) Received: by 10.114.183.4 with HTTP; Mon, 19 Mar 2007 09:37:53 -0700 (PDT) Message-ID: Date: Mon, 19 Mar 2007 17:37:53 +0100 From: "Nicolas Pouillard" To: "Loup Vaillant" Subject: Re: [Caml-list] Where are the AST specs? Cc: caml-list@yquem.inria.fr In-Reply-To: <6f9f8f4a0703190908j5e57d1b4l7d1d67ac98a93243@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <6f9f8f4a0703181022q2b9d7f8bt33919e07f3799c65@mail.gmail.com> <95513600703190145h5a0c6202t518ff61fcde83655@mail.gmail.com> <6f9f8f4a0703190217o5a975a78s16fe2be77825af01@mail.gmail.com> <6f9f8f4a0703190353p4d38ea32k30e1ad2a00f70f4@mail.gmail.com> <6f9f8f4a0703190742w3cd42978ib23a78163542729f@mail.gmail.com> <6f9f8f4a0703190908j5e57d1b4l7d1d67ac98a93243@mail.gmail.com> X-j-chkmail-Score: MSGID : 45FEBC63.000 on discorde : j-chkmail score : X : 0/20 1 0.000 -> 1 X-Miltered: at discorde with ID 45FEBC63.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; camlp:01 camlp:01 cmo:01 def:01 def:01 expr:01 expr:01 cmo:01 wrote:01 rec:01 rec:01 caml-list:01 assert:01 assert:01 macros:01 On 3/19/07, Loup Vaillant wrote: > 2007/3/19, Nicolas Pouillard : > > [...camlp4code...] > > $ cat test_macros.ml > > let cons x xs = x :: xs;; > > > > foldl(( + ), 1, 2, 3, 4);; > > foldr(cons, 1, 2, 3, []);; > > > > $ camlp4o ./macros.cmo test_macros.ml > > let cons x xs = x :: xs > > let _ = ((1 + 2) + 3) + 4 > > let _ = cons 1 (cons 2 (cons 3 [])) > > Impressive. > If it is possible, It would be best would be to be able to write something like: > (def_foldl + plus) > > and then just > (+ x y z) > (+ x y z w) > ... > The same for cons: > (def_foldr :: cons) > > (:: x y z L) > (:: x y z t []) $ cat macros.ml open Camlp4.PreCast;; let foldr_funs = ref [];; let foldl_funs = ref [];; AstFilters.register_str_item_filter begin Ast.map_expr begin function | <:expr@loc< def_foldr $lid:name$ $e$ >> -> foldr_funs := (name, e) :: !foldr_funs; <:expr@loc<()>> | <:expr@loc< def_foldl $lid:name$ $e$ >> -> foldl_funs := (name, e) :: !foldl_funs; <:expr@loc<()>> | e -> e end end#str_item;; AstFilters.register_str_item_filter begin Ast.map_expr begin function | <:expr@loc< $lid:name$($tup:e$) >> when List.mem_assoc name !foldl_funs -> let op = List.assoc name !foldl_funs in let rec foldl = function | [] -> assert false | [x] -> x | x :: xs -> <:expr@loc< $op$ $foldl xs$ $x$ >> in foldl (List.rev (Ast.list_of_expr e [])) | <:expr@loc< $lid:name$($tup:e$) >> when List.mem_assoc name !foldr_funs -> let op = List.assoc name !foldr_funs in let rec foldr = function | [] -> assert false | [x] -> x | x :: xs -> <:expr@loc< $op$ $x$ $foldr xs$ >> in foldr (Ast.list_of_expr e []) | e -> e end end#str_item;; $ cat test_macros.ml let cons x xs = x :: xs;; def_foldl ( !+ ) ( + );; def_foldr ( !:: ) cons;; !+ (1, 2, 3, 4);; !:: (1, 2, 3, []);; $ camlp4of ./macros.cmo test_macros.ml let cons x xs = x :: xs let _ = () let _ = () let _ = ((1 + 2) + 3) + 4 let _ = cons 1 (cons 2 (cons 3 [])) > > What's wrong with the current anti quotation system? > Err, actually, nothing... I just found the '$' ugly. But it is one > character, and I may as well use it "as is". I don't like the sacrifice of $ for that purpose but that's just a matter of taste. -- Nicolas Pouillard