The Master Guardian of the Source wrote:
> I'm strongly in favour of not keeping changing names. If we can do
> it, let's put the naming scheme you guys have settled on in 4.07.
Well, that's exactly my point: There is no coherent "scheme" yet. And
I'm not proposing random changes, only three small additions, one
having an additional bonus (see below).
> It's not officially out yet, but when it is people will start using
> it, and be cross if we change it in 4.08.
And that's exactly what I'm trying to avoid: Non-uniform names
becoming folclore. So again my plea is:
Every monadic constructor of a data type, i.e. a function of type
`... -> IO DataType' should be named `newDataType'. The old names
are retained for at least 4.07 and probably 4.08, but are clearly
marked as deprecated.
This will only break programs which e.g. import the whole module
StableName and contain a home-made function `newStableName', but let's
face it: How many people in the whole world are there having this
problem? Even in that highly improbable case, an explicit import list
(preferred for backwards compatibility) or a simple hiding clause can
cure the problem.
Perhaps we should start a small discussion thread in the Haskell list
around naming conventions and write down some guidelines.
> Im also still wondering whether the original makeForeignObj (or
> whatever it was) should be restored, since I gather its name is now
> available, to avoid gratuitously breaking people's existing programs.
> Sigbjorn might legitimately be irritated at having to change HDirect
> back, but we might all consider it worth it to avoid causing hassle to
> others.
I'm in favour of resurrecting the old definition, of course marked as
deprecated.
Some final remarks about my view of lib/compiler changes in general.
Existing programs fall in one of several categories:
* Programs written in pure H98 + standard H98 libs: Apart from very
few exceptions, these are probably only toy ones. They are not
affected by the changes in discussion, anyway.
* Programs written in pure H98 + non-H98 libs: This category is
probably much larger and *is* affected by the changes. But even
these programs must already have some time of #ifdef-ery/autoconf
magic ("Hmmm, is GetOpt in syslib/package util or exts? And where
is Addr?"). So some cautious changes in the libs don't make
things any worse here.
* Programs written in H98 + language extensions (FFI, one of the
several extensions to the type system, ...) + probably some
non-H98 libs: This category is probably the largest one. But the
*really* serious compatibility/portability problems are not some
simple name changes, but fundamental things like: Does the FFI
automatically unwrap newtypes or not? Are overlapping instances
supported or not? What about MPTC? Does a library like Storable
exist at all? You currently won't survive without comitting
yourself to a specific Haskell system (probably version no >= XY)
*plus* autoconf or something similar anyway.
The hslibs don't have a `final' status yet, like H98, and this is a
good thing. They still contain some rough edges and inconsistencies,
so let's get things right before it is too late.
And, hey! People obviously even live with the following cruel
versionitis (taken from the M$ compiler docs, one of my favourites):
-------------------------------------------------------------------
The InterlockedDecrement function both decrements (decreases by
one) the value of the specified 32-bit variable and checks the
resulting value. The function prevents more than one thread from
using the same variable simultaneously.
LONG InterlockedDecrement(
LPLONG lpAddend // address of the variable to decrement
);
Parameters:
lpAddend
Pointer to the 32-bit variable to decrement.
Return Values:
Windows 98, Windows NT 4.0 and later: The return value is the
resulting decremented value.
Windows 95, Windows NT 3.51 and earlier: If the result of the
operation is zero, the return value is zero. If the result of the
operation is less than zero, the return value is negative, but it
is not necessarily equal to the result. If the result of the
operation is greater than zero, the return value is positive, but
it is not necessarily equal to the result.
Remarks:
The functions InterlockedDecrement, InterlockedCompareExchange,
InterlockedExchange, InterlockedExchangeAdd, and
InterlockedIncrement provide a simple mechanism for synchronizing
access to a variable that is shared by multiple threads. The
threads of different processes can use this mechanism if the
variable is in shared memory. The variable pointed to by the
lpAddend parameter must be aligned on a 32-bit boundary; otherwise,
this function will fail on multiprocessor x86 systems.
-------------------------------------------------------------------
Quite a mess for an atomic `--lpAddend'... And what is W2k doing here?
:-P
Cheers,
Sven