Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Pierre Weis <Pierre.Weis@inria.fr>
To: oliver@fritz.traverse.com (Christopher Oliver)
Cc: caml-list@inria.fr
Subject: Re: Let rec trouble
Date: Mon, 27 Jul 1998 20:30:38 +0200 (MET DST)	[thread overview]
Message-ID: <199807271830.UAA24446@pauillac.inria.fr> (raw)
In-Reply-To: <E0z09eQ-00007g-00@fritz.traverse.net> from "Christopher Oliver" at Jul 25, 98 03:06:38 pm

> I'm having trouble with the syntax of let rec.  Consider the following
> program for computing Van der Waerden's bound:
> 
>   open Num
>   open Nat
>   open Big_int
>   open Ratio
> 
>   let rec n k l =
>     let rec m i =
>       if i =/ Int 0 then
>         Int 1 else
>         Int 2
>           */ (m (pred_num i))
>           */ (n (k **/ (m (pred_num i))) (pred_num l)) in
>     if l =/ Int 2 then succ_num k else m k;;
> 
>   print_string (string_of_num (n (Int 3) (Int 3)));;
> 
> I would like to restrict the lexical scope of 'n' by replacing the first
> double semicolon with 'in.'  I nest m precisely to capture k and l in m's
> lexical environment.  Why is this use forbidden?  I.e. Why shouldn't I be
> able to write:
> 
>   let rec n k l =
>     let rec m i =
>       if i =/ Int 0 then
>         Int 1 else
>         Int 2
>           */ (m (pred_num i))
>           */ (n (k **/ (m (pred_num i))) (pred_num l)) in
>     if l =/ Int 2 then succ_num k else m k
>   in
>     print_string (string_of_num (n (Int 3) (Int 3)));;
> 
> I would prefer not to define a top level symbol, and this seems an
> inconsistancy.  Am I missing something?
> 
> -- 
> Christopher Oliver                     Traverse Internet
> Systems Coordinator                    223 Grandview Pkwy, Suite 108
> oliver@traverse.net                    Traverse City, Michigan, 49684
> let magic f = fun x -> x and more_magic n f = fun x -> f ((n f) x);;

You're second program is perfectly legal in Caml (and Objective Caml)
and indeed works fine.

The problem (if any) is that this program leads to a huge computation
(the result is an integer number with 50100 decimal digits). Thus it
takes a while to run, and that may be the reason why you thought the
second version did not work properly: in the first version, when
defining the n function first you had not to wait for any
computation. You just have to wait for the answer when evaluating
print_string (string_of_num (n (Int 3) (Int 3)));;. On the other hand,
when mixing the final computation and the function definition you had
to wait until the end of the entire computation.

I assume you were using the interactive system, hence your
surprise. If you were writing stand alone programs, the compiler
whould have properly compiled the two versions of your program and you
would never have noticed any problem!

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/







  reply	other threads:[~1998-07-27 18:49 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1998-07-25 19:06 Christopher Oliver
1998-07-27 18:30 ` Pierre Weis [this message]
     [not found] <199807280014.CAA01029@pauillac.inria.fr>
1998-07-28  6:15 ` Christopher Oliver

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=199807271830.UAA24446@pauillac.inria.fr \
    --to=pierre.weis@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=oliver@fritz.traverse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox