From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id GAA25406; Tue, 23 Dec 2003 06:34:55 +0100 (MET) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id GAA25921 for ; Tue, 23 Dec 2003 06:34:54 +0100 (MET) Received: from mz1.forethought.net (mzpi3.forethought.net [216.241.36.12]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id hBN5Yrv13340 for ; Tue, 23 Dec 2003 06:34:53 +0100 (MET) Received: from [216.241.35.41] (helo=swordfish) by mz1.forethought.net with esmtp (Exim 4.14) id 1AYfC0-0003Go-29 for caml-list@pauillac.inria.fr; Mon, 22 Dec 2003 22:34:52 -0700 Received: from matt by swordfish with local (Exim 3.35 #1 (Debian)) id 1AYfBz-0000z1-00 for ; Mon, 22 Dec 2003 22:34:51 -0700 Date: Mon, 22 Dec 2003 22:34:51 -0700 From: Matt Gushee To: caml-list@pauillac.inria.fr Subject: Re: [Caml-list] Frustrated Beginner Message-ID: <20031223053451.GB1145@swordfish> Reply-To: Matt Gushee Mail-Followup-To: caml-list@pauillac.inria.fr References: <1072152186.59938.30.camel@tylere> <29911.24.6.3.124.1072153159.squirrel@www.cs.fiu.edu> <1072152186.59938.30.camel@tylere> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <29911.24.6.3.124.1072153159.squirrel@www.cs.fiu.edu> <1072152186.59938.30.camel@tylere> User-Agent: Mutt/1.3.27i X-Loop: caml-list@inria.fr X-Spam: no; 0.00; gushee:01 mgushee:01 havenrock:01 caml-list:01 jones':01 csc:99 semicolons:01 semicolon:01 semicolon:01 model:01 foo:01 endline:01 endline:01 gushee:01 englewood:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk On Mon, Dec 22, 2003 at 11:03:07PM -0500, Tyler Eaves wrote: > > I'm a 19 yr old computer science student, been programming for perhaps > 10 years. ... Welcome! I'm at best an intermediate OCaml programmer, but I'll try to make a helpful suggestion or two. > So why is O'Caml giving me so much trouble? Do you have any previous experience with functional programming (FP), or have you studied FP in school? If not, then you're learning both a new syntax and a very different programming paradigm at once, so you should expect a steep learning curve. But I think if you stick with it, after a while it will all start to make sense, and you'll be glad you made the effort. > I've been trying to pick it up for about a week now, read various > online tutorials. Which ones? Personally, I have found David Matuszek's and Richard Jones' tutorials to be the most helpful for learning fundamentals. http://www.csc.vill.edu/~dmatusze/resources/ocaml/ocaml.html http://www.merjis.com/richj/computers/ocaml/tutorial/ > My biggest source of problems seems to be the syntax. I'm totally > confused as far as ; vs ;; vs nothing, ... Yes, that is a bit tricky. You've undoubtedly read explanations of the semicolons, but sometimes it helps if you get the same information again in slightly different terms, so let me try: * A double semicolon ends a "sentence"--that is, it terminates a top-level construct such as a function definition--but not nested function definitions, because they're not "sentences," they're "phrases". You can omit ;; in most cases, but I would suggest at first using it everywhere it is allowed. When you omit the ;; and there is a syntax error in your code, the compiler often goes many lines past the real trouble spot before it detects an error, so using ;; everywhere can narrow down your search. * The single semicolon is perhaps a bit harder to understand, but I think it helps to keep in mind that OCaml is basically a functional language, yet it also supports imperative programming. Being functional means that there are no statements per se. It's all about evaluating expressions, and *every* expression returns a value. However, there are expressions that are functionally equivalent to statements. In order to conform to the functional model, they have to return a value, but there is no useful value to return. So they return the unit value, '()'. Basically, whenever you are programming imperatively--when you have one of these pseudo-statements that return (), and when it this imperative phrase is not the final result of a function, you need to separate it from the following phrase with a single semicolon. A simple example: match foo with | None -> print_endline "Nothing"; "" | Some x -> print_endline x; x This expression returns a string, but before returning, you want to print a message. Printing functions, of course, return (). Hope this helps a bit. Best of luck to you! -- Matt Gushee When a nation follows the Way, Englewood, Colorado, USA Horses bear manure through mgushee@havenrock.com its fields; http://www.havenrock.com/ When a nation ignores the Way, Horses bear soldiers through its streets. --Lao Tzu (Peter Merel, trans.) ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners