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 GAA26987; Tue, 23 Dec 2003 06:58:48 +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 GAA26686 for ; Tue, 23 Dec 2003 06:58:46 +0100 (MET) Received: from bob.west.spy.net (mail.west.spy.net [66.149.231.226]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id hBN5wiv15153 for ; Tue, 23 Dec 2003 06:58:44 +0100 (MET) Received: from [192.168.1.50] (dustinti.west.spy.net [192.168.1.50]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (Client did not present a certificate) by bob.west.spy.net (Postfix) with ESMTP id 3C67259CD; Mon, 22 Dec 2003 21:58:42 -0800 (PST) In-Reply-To: <1072152186.59938.30.camel@tylere> References: <1072152186.59938.30.camel@tylere> Mime-Version: 1.0 (Apple Message framework v609) Content-Type: text/plain; charset=US-ASCII; format=flowed Message-Id: <0D3B5ECF-350D-11D8-A8F7-000393CB0F1E@spy.net> Content-Transfer-Encoding: 7bit Cc: caml-list@inria.fr From: Dustin Sallings Subject: Re: [Caml-list] Frustrated Beginner Date: Mon, 22 Dec 2003 21:58:38 -0800 To: Tyler Eaves X-Mailer: Apple Mail (2.609) X-Loop: caml-list@inria.fr X-Spam: no; 0.00; caml-list:01 python:01 langauges:01 python:01 conceptually:01 workout:99 ciphers:01 recursion:01 postion:99 parens:01 currying:01 haskell:01 recursion:01 char:01 argv:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk On Dec 22, 2003, at 20:03, Tyler Eaves wrote: > I'm a 19 yr old computer science student, been programming for perhaps > 10 years. Started (Like so many did in the early '90s with QBasic in > DOS. These days most of my work is done in either PHP (web stuff) or > Python (everything else) with the occasional bit of C for stuff that > needs to run really fast. I'm also passingly familiar with a number of > other langauges (C++, Java, Perl, etc). > > So why is O'Caml giving me so much trouble? I've been trying to pick it > up for about a week now, read various online tutorials. I'm just having > no luck at all. My largest program to date (that works) is all of 3 > lines long, and simply printed out the command line arguments passed to > the program. Well, lack of variety, honestly. C++, Java, and C are all pretty much the same language in the grand scheme of things. Perl means a lot of different things to a lot of different people. Python is also not that much different conceptually, just a slight change in syntax. Ocaml is a bit strange in a lot of ways, but it doesn't really take that long to get used to. Like anything else, you just need to find a problem and solve it with the language. I had a pretty large mental workout last night writing a little program to solve one of those monoalphabetic random substitution ciphers. A lot of it was helping me figure out more areas of the syntax I've not explored. Functional programming in general is a lot different from just about anything you've done in any of the languages you've mentioned. You might find yourself rarely using variables, having side-effects extremely rarely, and doing a lot of stuff with higher order functions in general (which you can do to a degree in python and perl). Oh, and get comfortable with recursion. Most functional languages are tail recursive and it's the preferred method for looping. Some languages (like OCaml) have imperative loop constructs, but they could just as easily have been left out. > My biggest source of problems seems to be the syntax. I'm totally > confused as far as ; vs ;; vs nothing, when to use ( ), and things of > the like. It doesn't help that the compiler is completly naive when it > comes to Syntax Errors. It would be so helpful if it could give an > error > message that actually told the programmer what it expected. I realise > that O'Camls syntax allows many things, so that it may be hard to say > exactly what it WAS expecting in all cases, but surely SOMETHING > meaningful, besides a charater postion could be given? ; is when you're writing more imperative code. In an imperative style, you give the computer a list of things to do and tell it the order in which to do things. That's not so much the case in a functional style. ;; is used to end a definition altogether. Parens are interesting. They're generally not required unless you want to contain something into being one argument. I use them a lot for clarity, but you typically do not want to use them for function calls. This is mainly because currying (which probably won't make sense to you until you've been using ocaml or haskell or something else that supports it for a little while) makes a lot of things better. :) Overall, once you get more comfortable with the syntax, it won't be so bad. > What I'd really like is a site with examples of actual programs. Most > of > the example code I've seen is A: Not commened and B: Recursive > Mathematical functions. I'd really love to see an example, of say, > reading in a file, looking at each character, and doing something when > it encounters, say, a tab. Or any other such program that actually does > something. You should expect to see a lot of recursion. One possible solution for the example you're requesting might look like this: let rec loop s = ( match Stream.next s with '\t' -> print_string(" - tab - ") | c -> print_char(c) ); loop s ;; let f = open_in Sys.argv.(1) in try (* Loop on this stream *) loop (Stream.of_channel f); (* The previous statement had a sem because it's an imperative style here *) close_in f with Stream.Failure -> (* Occurs at the end of the stream *) close_in f; That's not exactly how *I'd* do it because I've got file processing functions I use that handle all of the failures and stuff for me, but it's an example. There are other errors that my occur during your file that this won't handle (making sure your fd gets closed). I probably also wouldn't have loop as a separate function (actually, I pulled it out for this example). It's close enough, though. You're welcome to read through any of my code (you'll need tla or another arch system installed). Not all of it's well commented, but it certainly does stuff. :) > I really want to like O'Caml. It seems to offer a very nice feature > set, > and the ability to compile to super-fast native code is the icing on > the > cake. Right now though, I'm frustrated and on the verge of giving up. I don't believe it's the easiest FP language to learn. Certainly scheme has a very simple syntax (though no currying, which I think does actually make things easier once you get going). I've been using it quite a bit for day-to-day work just because it's so amazingly fast and works consistently. I had a scheme compiler I was using for a while that would sometimes cause me problems (implementation bugs) and wasn't nearly as fast. I'm glad I finally came around to trying ocaml again. -- SPY My girlfriend asked me which one I like better. pub 1024/3CAE01D5 1994/11/03 Dustin Sallings | Key fingerprint = 87 02 57 08 02 D0 DA D6 C8 0F 3E 65 51 98 D8 BE L_______________________ I hope the answer won't upset her. ____________ ------------------- 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