<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>C++ fixes this sort of thing. goto around initialization is an error.<BR>
C++ constructors and destructors are a really good thing -- can't forgot to initialize or cleanup stuff.<BR>
Very much like try/finally, but the finally code is better "positioned".<BR>
Rather than special case memory with some fancy garbage collector, provide a mechanism for any type.<BR>
RAII and all that.<BR>
 <BR>
It's a very good theory at least.<BR>
 <BR>
However I've become uncertain of it.<BR>
Could be that a huge part of it is ok, if only you could train everyone in RAII and constructors/destructors.<BR>
But then there are close pesky fopen/fclose/malloc/free you have to get rid of.<BR>
 <BR>
And a lot of complexity around templates, unrelated, but can you allow C++ in a codebase but rigorously ban certain aspects?<BR>
 <BR>
Maybe draw an analogy to Itanium.<BR>
Lots of obviously good features, not even all that novel. But must we really combine them all together all at once?<BR>
(register windows a la SPARC, loop unrolling a la any decent compiler..)<BR>
 <BR>
And maybe memory is really vastly more interesting than other resources?<BR>Oh, and locks, special case those too...<BR>
 <BR>
Mika your switch example, besides being invalid C++, is just not fair.<BR>
I don't think people even think to write their code like that.<BR>
Introducing variables at the top of a switch is rare, esp. initializing them.<BR>
 <BR>
That C allows variables declared anywhere, and open braces anywhere, seems little known and little taken advantage of.<BR>
Everyone just moves all the locals to the top, and either programmers do careful static flow analysis, or "lazily" (but reasonably) "over initialize" things, like maybe to 0 or { 0 }.<BR>
 <BR>
C++ is what really fixes this properly and people know and understand it.<BR>
Declare stuff anywhere, closest to first, use, and preferably initialized or a user defined type with a constructor.<BR>
EXCEPT that it doesn't play nicely with goto, and if you aren't using exceptions, then goto is the next best thing...so then you are forced into something closer to the C style, though you gain constructors to help some.<BR>
 <BR>
And hopefully the compiler can optimize away a lot of the unnecessary initialization...<BR>
 <BR>
Java and I presume C# have a nice feature here too where they require the compiler to error for use of uninitialized variables, though I suspect the specced algorithm misses some things, like:<BR>
 <BR>
  if (...)  <BR>
    initialize x  <BR>
 <BR>
common code  <BR>
 <BR>
  if (same thing)  <BR>
    use x   <== possible use of uninitialize x, not <BR>
 <BR>
At least I've seen other tools (not Java/C# compilers, I don't use those) get confused by this..<BR>
 <BR>
 - Jay<BR><BR><BR>

<HR id=stopSpelling>
<BR>
> To: hendrik@topoi.pooq.com<BR>> Date: Tue, 12 Feb 2008 05:41:31 -0800<BR>> From: mika@async.caltech.edu<BR>> CC: m3devel@elegosoft.com<BR>> Subject: Re: [M3devel] introducing VAR in more places?<BR>> <BR>> hendrik@topoi.pooq.com writes:<BR>> >On Mon, Feb 11, 2008 at 10:17:13PM -0600, Rodney M. Bates wrote:<BR>> >> I don't think this is what Tony meant. In C++, an opening brace<BR>> >> starts a block, but every local declaration in that block has its own<BR>> >> unique scope that only starts at that declaration and goes to the end<BR>> >> of the block. This is particularly messy because the local declarations<BR>> >> of a block need not all precede all the statements,<BR>> ><BR>> >That is, in my opinion, one of the few things that C and C++ did right, <BR>> >well, almost right. It permits a coding style in which every <BR>> >variable declaration is initialised, and is declared if and only if it <BR>> <BR>> You can do all kinds of fun stuff with C's declarations/initializations.<BR>> <BR>> switch (a) {<BR>> int x=7;<BR>> case 0:<BR>> use(x); /* oops */<BR>> ...<BR>> }<BR>> <BR>> goto somewherefun;<BR>> <BR>> {<BR>> int y=7;<BR>> <BR>> somewherefun:<BR>> use(y); /* oops again */<BR>> }<BR>> <BR>> <BR>> >has a value. Now that's a useful property. It fails for recursion, <BR>> >so there are limits in how far it can apply. And when coding like this, <BR>> >you want the simplest syntax to define a constant identifier -- one <BR>> >whose value cannot be rebound except by reexecuting the entire block. <BR>> >Making something that can change should require more effort -- like <BR>> >adding a keyword "var" or some such.<BR>> <BR>> Sounds to me like you're talking about Modula-3's WITH!<BR>> <BR>> Mika<BR><BR><br /><hr />Shed those extra pounds with MSN and The Biggest Loser! <a href='http://biggestloser.msn.com/' target='_new'>Learn more.</a></body>
</html>