From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by yquem.inria.fr (Postfix) with ESMTP id 6FC44BB81 for ; Mon, 24 Oct 2005 07:20:55 +0200 (CEST) Received: from smtp3.adl2.internode.on.net (smtp3.adl2.internode.on.net [203.16.214.203]) by nez-perce.inria.fr (8.13.0/8.13.0) with ESMTP id j9O5KqJv007453 for ; Mon, 24 Oct 2005 07:20:54 +0200 Received: from rosella (ppp11-173.lns1.syd7.internode.on.net [59.167.11.173]) by smtp3.adl2.internode.on.net (8.12.9/8.12.6) with ESMTP id j9O5KoWF037733 for ; Mon, 24 Oct 2005 14:50:51 +0930 (CST) (envelope-from skaller@users.sourceforge.net) Subject: how to implement generic operators From: skaller To: caml-list@yquem.inria.fr Content-Type: text/plain Date: Mon, 24 Oct 2005 15:20:50 +1000 Message-Id: <1130131250.28443.79.camel@rosella> Mime-Version: 1.0 X-Mailer: Evolution 2.2.1.1 Content-Transfer-Encoding: 7bit X-Miltered: at nez-perce with ID 435C6F35.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; iter:01 ocaml:01 iter:01 ocaml:01 compiler:01 converts:01 combinators:01 compiler:01 combinators:01 binary:01 binary:01 parsing:01 variants:01 metaocaml:01 .....:98 X-Spam-Checker-Version: SpamAssassin 3.0.3 (2005-04-27) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.0.3 I am looking for some ideas on how to implement generic operators. To explain what I mean by that: consider some operations such as: fold, map, iter. In Ocaml these are polymorphic. A generic iter would be something like: iter f [1; 2.0; "hello"] --> f 1; f 2.0; f "hello" Now, within Ocaml itself this doesn't make sense. However my question relates to how to *implement* such an operation in a compiler. In that case, the list above is a list of *terms* not values -- so there is no typing problem, provided the reduction rules ground at compile time. Now for the problem: there are a LOT of such operators. Here is another example: compose [f; g; h; k] and another ravel [f; g; h; k] which converts a product of functions to a function of products. I want the USER to be able to define these operations, and provide only a minimal set of combinators in the compiler. Obviously, one of the key combinators is fold, since all of the above operations suffer from the problem that whilst the user can .. as in Ocaml .. easily define a binary version of the operator .. there is no way in the target language to handle *lists* of arguments: the compiler itself can do so easily by using Ocaml lists of terms, but the user cannot modify the compiler to add new combinators. To make the problem concrete: suppose I would like to avoid: Compose of term list Ravel of term list ..... each of which uses much the same reduction rules: it expands to some tree or using more basic binary primitives .. I would clearly need some representation like: Assoc of op * term list and then some kind of fold which works for all different binary op, where now 'op' is defined by the user. So crudely the question is: what is the representation of 'op' required so the generic fold can create a wide class of generic n-ary operations from binary ones? Note the data for op will be obtained by parsing in the input program, so cannot consist of just a fixed list of variants. Crudely .. I am looking for a way to declare a function which instead of having 'two' arguments, can have n. All the arguments must be the same KIND so their terms have the same type, but the arguments obviously will not have the same type. Hope this makes sense .. I have a feeling MetaOcaml can do this already. -- John Skaller Felix, successor to C++: http://felix.sf.net