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=0.0 required=5.0 tests=none autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id 32B3DBBCA for ; Tue, 15 Apr 2008 16:07:09 +0200 (CEST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApoEACZTBEjAXQIm/2dsb2JhbACnWoVH X-IronPort-AV: E=Sophos;i="4.25,660,1199660400"; d="scan'208";a="25028937" Received: from discorde.inria.fr ([192.93.2.38]) by mail4-smtp-sop.national.inria.fr with ESMTP; 15 Apr 2008 16:07:09 +0200 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id m3FE78Le002000 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Tue, 15 Apr 2008 16:07:08 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AicEAGNTBEhA6aq4ZGdsb2JhbACRRB8CIpVXhUc X-IronPort-AV: E=Sophos;i="4.25,660,1199660400"; d="scan'208";a="9608752" Received: from rn-out-0910.google.com ([64.233.170.184]) by mail2-smtp-roc.national.inria.fr with ESMTP; 15 Apr 2008 16:07:07 +0200 Received: by rn-out-0910.google.com with SMTP id i6so919482rng.2 for ; Tue, 15 Apr 2008 07:07:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition; bh=ASebnUoe+q0M0nV9eyjoAcFGgI/P1s6qpjSSkuPRKxc=; b=tveu9vhndAe2eGD1odu4Uk1mG8aZYh4OfeCPgAfFhai1p2R71H//93hTOlXuNd9qXhTbTFjYft1gpf5SLb5B1ERULG1KDCYS8Vmkwb2Vd5Fmx8D+dkdACiA+eKf17DFIUaN7c0E8JNLnWdxLaK8dqzN73d5BZkJxdUUPR0O9J8g= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition; b=eUJ30USKSOyvJTEyeX9TdTI5xXu4h8KzptyvA+nJ304hdYFv/04EAUu0XwVaARE0Hq8CYFTrThVDTKpTFYRhstjAngz3oJEC0yuwfxDg/g8/YHkR+IrqzqLUhCOkD+FDDL1VyLdCR91kS39OsjXgBJCfcJlt35pjqVrTa2+FEKM= Received: by 10.142.147.15 with SMTP id u15mr2262504wfd.149.1208268426184; Tue, 15 Apr 2008 07:07:06 -0700 (PDT) Received: by 10.142.191.7 with HTTP; Tue, 15 Apr 2008 07:07:06 -0700 (PDT) Message-ID: <5b0248170804150707x4b204441x2ee5b7d0aaf39540@mail.gmail.com> Date: Tue, 15 Apr 2008 23:07:06 +0900 From: "Sanghyeon Seo" To: caml-list@inria.fr Subject: Non-tail return MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Miltered: at discorde with ID 4804B68C.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; type-safe:01 sparcs:01 ocaml:01 unification:01 translated:01 translated:01 seo:98 seo:98 stack:01 stack:01 compile:01 unit:03 implicit:03 implicit:03 raise:03 Richard Jones suggested that type-safe return statement which immediately returns from the innermost function would be useful. So I developed an implementation. His sample code (from Extlib) works as-is. http://sparcs.kaist.ac.kr/~tinuviel/devel/ocaml/ Some notes: * This depends on nontail exit patch I did as a part of break/continue patch. break-continue-v2 was broken to break-continue-v3 and nontail-exit-v1. * A stack of function's return type is maintained. "return e" causes unification of "e" and return type on the top of the stack. "return e" itself is typed as unit. * Function is translated with implicit catch around body, and return is translated to raise. Simplification removes implicit catch when no return is used, so existing codes should compile same. -- Seo Sanghyeon