Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
Bug in Filename.basename?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2007-09-06 (04:58)
From: skaller <skaller@u...>
Subject: Re: [Caml-list] Bug in Filename.basename?
On Wed, 2007-09-05 at 22:39 +0200, Oliver Bandel wrote:

> The behaviour of OCaml's
>   Filename.concat (Filename.dirname) (Filename.basename)
> makes sense to me. IMHO it should be done the way OCaml does it.

You fail to understand that this requirement is ALSO
met by Posix C functions and bash.

The difference is Ocaml's function doesn't have well specified
semantics, whereas Posix is an International Standard backed
by the United Nations.

The Ocaml manual says this:

"Moreover, after setting the current directory to dirname name (with
Sys.chdir), references to basename name (which is a relative file name)
designate the same file as name before the call to Sys.chdir.

And that is in fact rubbish: filename functionality is not
directly related to the filesystem, because the files need
not exist (or may not agree with the specified name in kind).

Other than this text, the Ocaml manual in fact does NOT
specify what happens if there is a trailing / character.

Posix does. So you're wrong on all counts here.
There's no excuse for Ocaml not doing one of:

	a) following the Posix rules on a Posix platform
	   AND saying so
	b) following other rules, AND describing them

In general, a WEAK specification is good, and the Ocaml
specification here is weak: it doesn't specify what happens
if there is a trailing / character. However in THIS case
the user may be surprised at what it actually does.

Indeed, the OP Eric was surprised!

The fact is I AGREE WITH YOUR ARGUMENT if you would be arguing
that it is sensible to consider that since in Unix you cannot
tell if a filename refers to a directory or a non-directory file,
a SENSIBLE CONVENTION is to put a / at the end if you mean a 

I agree, that's sensible. But it doesn't matter. The purpose
of the Filename module is to process filenames in a way that
closely matches the normal behaviour of native functions on
the native platform .. and the interpretation above IS NOT DOCUMENTED.

John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: