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 WAA21615; Sun, 21 Apr 2002 22:55:11 +0200 (MET DST) 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 WAA21362 for ; Sun, 21 Apr 2002 22:55:10 +0200 (MET DST) Received: from hirsch.in-berlin.de (hirsch.in-berlin.de [192.109.42.6]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id g3LKt9103491 for ; Sun, 21 Apr 2002 22:55:09 +0200 (MET DST) Received: from hirsch.in-berlin.de (localhost [127.0.0.1]) by hirsch.in-berlin.de (8.12.1/8.12.1/Debian -2) with ESMTP id g3LKt2JO012995 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NOT) for ; Sun, 21 Apr 2002 22:55:02 +0200 Received: (from uucp@localhost) by hirsch.in-berlin.de (8.12.1/8.12.1/Debian -2) with UUCP id g3LKt1ZA012987 for caml-list@inria.fr; Sun, 21 Apr 2002 22:55:01 +0200 X-Envelope-From: oliver@first.in-berlin.de X-Envelope-To: caml-list@inria.fr Received: from localhost (oliver@localhost) by first.in-berlin.de (8.7.6/8.7.3) with SMTP id WAA00303 for ; Sun, 21 Apr 2002 22:50:38 +0200 Date: Sun, 21 Apr 2002 22:50:37 +0200 (MET DST) From: Oliver Bandel To: caml-list@inria.fr Subject: [Caml-list] Unix-Filekind => codexample with questions Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk Hello, I need a function, which tells me if a file is a regular file or not. Please look at my code-example: let is_regularfile name = let filekind name = let tmp = Unix.stat name in tmp.Unix.st_kind in let fk = try (filekind name ) with | Unix.Unix_error (Unix.ENOENT,_,_) -> Unix.S_DIR | _ -> Unix.S_DIR in match fk with | Unix.S_REG -> true | _ -> false;; This example works: It tells me, if a file is of kind/type regular file with true. If it is not a regular file or an error occured, it tells me this by passing me the result false. I thought about printing an error-message when an error occurs. I can do this by inserting a printing-command into the try-construct, if I return a Unix.st_kind-value (so that Ocaml get's right types back). I tried this, and it works - so I know how to handle the Unix.ENOENT (and that makes my lucky :)). But I nevertheless have more questions. IMHO it looks a littlebid dirty, to return Unix.S_DIR on an error-case, even if it is only internal to the function is_regularfile. Yes, I know, here is it an advantage of FPLs to give back only the result and have the inner dirty tricks encapsulated by the scoping here (at least that it is possible to programn in this way, even if not mandatory). But If I would split up the function into three functions (one returning the filetype, one doing the error-/exception-handling (giving back non-Unix.S_REG e.g by using Unix.S_DIR) and one function, using these two functions, returning a boolean value) the advantage of an FPL is gone, because using unclean programming (which then nevertheless is possible). (Or is the problem here, that pattern-matching and exception-handling is not purely functional?) Is there a type like "None of the defined Unix.st_kind-results", such as NULL in C is definitely a non-valid address? Does advantage of FPLs in respect to clean programming belongs in "encapsulation by scoping" with nested let-statements, which are hiding usage of unclean values (like above)? Or is it completely ok to write such functions like above? (Philosophically question...?!) BTW: What about the indentation-style of my function? How would you rewrite that function, when using Ocaml-like indentation? TIA, Oliver ------------------- 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