From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id UAA22632 for caml-red; Sat, 5 Aug 2000 20:12:07 +0200 (MET DST) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id UAA12636 for ; Fri, 4 Aug 2000 20:33:32 +0200 (MET DST) Received: from mail3.microsoft.com (mail3.microsoft.com [131.107.3.123]) by concorde.inria.fr (8.10.0/8.10.0) with SMTP id e74IXVX26737 for ; Fri, 4 Aug 2000 20:33:31 +0200 (MET DST) Received: from 157.54.9.100 by mail3.microsoft.com (InterScan E-Mail VirusWall NT); Fri, 04 Aug 2000 11:33:01 -0700 (Pacific Daylight Time) Received: by INET-IMC-03 with Internet Mail Service (5.5.2651.58) id ; Fri, 4 Aug 2000 11:33:00 -0700 Message-ID: From: Don Syme To: "'Walid Taha'" , caml-list@inria.fr Subject: RE: Imperative programming in Caml Date: Fri, 4 Aug 2000 11:33:19 -0700 X-Mailer: Internet Mail Service (5.5.2651.58) Sender: weis@pauillac.inria.fr I don't know how it fits with the grammar, but something like mutable finished = false mutable list = Empty mutable here = list might make things a bit clearer. You could have implicit dereferencing for everything declared with "mutable" and something like C's "&finished" if you wanted to pass the reference. Just a thought, Don -----Original Message----- From: Walid Taha [mailto:taha@cs.chalmers.se] Sent: 03 August 2000 20:20 To: caml-list@inria.fr Subject: Imperative programming in Caml [Apologies in advance for purists that this project might offend.] Dear all, Below is one of my first attempts at imperative programming in ML: a program that reads a list of numbers and squares them, using a "mutable list". The presence of a "while" construct and easy of terminal IO in Caml should help an imperative programmer feel at home. But I am concerned (and a bit surprised, actually) that the use of "let" bindings and the presence of normal variables in addition to "mutable" variables might make it more difficult to explain this program to a beginer that is *not* interested in the functional aspects. If any one has suggestions for making this program more "imperative", I would appreciate it. Many thanks in advance, Walid. --- let squareMany () = print_string "\nPlease enter zero (0) to stop.\n\n"; let finished = ref false and list = ref Empty in let here = ref list in while not(!finished) do print_string "Enter a number : "; let number = read_int () in if number<>0 then begin let new = ref Empty in !here := Cell (number, new); here := new; end else begin finished:=true; end done; print_string "Here are the squares of the numbers you entered: "; while (!list)<>Empty do let (Cell(number, rest)) = !list in print_int (number*number); list := !rest; print_string " "; done; print_string "\n\nGood bye!\n\n";;