<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>What is the right way to have a variably sized but always small array in Modula-3?<BR>My array will only ever have 1 or 2 elements.<BR>I'd like to always allocate room for 2 elements, and have there be a size.<BR>
<BR>It seems I have a choice of<BR>
<BR>a) an "open" array<BR>b) wrap it up in a record<BR>
<BR>I'd like so have, like:<BR>
<BR>TYPE A = ARRAY [0..1] OF FOO;<BR>
<BR>And be able to say:<BR>
<BR>VAR<BR> a : A;<BR>
<BR> ..<BR> a.size<BR> FOR i := 0 TO a.size DO<BR>   do something with a[i]<BR>
<BR>It seems I have no option but, like:<BR>
<BR>TYPE A = RECORD<BR>  a: ARRAY[0..1] OF FOO;<BR>  size := 1; (* usually of size 1, sometimes 2 *)<BR>END<BR>
<BR>and then<BR> FOR i := 0 TO a.size DO<BR>  do something with a.a[i];<BR>
<BR>That is "ok". Not great -- what to call the inner a?<BR>
But then furthermore, I'd like to construct constants.<BR>It seems I am stuck with either the verbose:<BR>
<BR>PROCEDURE F(a:A);<BR>
<BR>F( A { ARRAY[0..1] OF FOO { .. } );<BR>
<BR>OR I have to come up with a name for the embedded array.<BR>But of course, its type is really "the same" as the outer type.<BR>
<BR>To wit:<BR>
<BR>TYPE FooArray = ARRAY[0..1] OF Foo;<BR>
<BR>TYPE FooArray = RECORD<BR>  a : FooArray;<BR>  size := 1;<BR>END;<BR>
<BR>F( FooArray { FooArray { .. } );<BR>
<BR>But I have to come up with different names.<BR>
<BR>And I don't think I can leave out the name for the constructor, like:<BR>
<BR>F( FooArray { { .. } );<BR>
<BR>Though that might seem nice.<BR>
<BR>Am I understanding everything?<BR>
<BR>Have folks hit this before and there's a set of names that don't seem too lame<BR>that folks use?<BR>
 <BR>
Also -- language documentation?<BR>Nelson's green book is excellent.<BR>The stuff in the doc directory is very dry and scientific.<BR>The tutorial seems more like a reference. Or maybe I didn't read it enough.<BR>Is there better, in case I need a refresher?<BR>I think I got it, via Nelson's book from memory (wonder if I can find mine..) and the reference,<BR>but I don't think anyone could learn from the current online docs in the source tree.<BR>
<BR>Maybe it's me, some combination of laziness and short attention span<BR> as I age..<BR>
 <BR>
Btw, C doesn't offer a great solution here, though it offers leaving out some type names.<BR>In C++ I could have both .size and operator[].<BR>Modula-3 seems to be missing operator overloading.<BR>It's got some builtin stuff, even array assignment and equality and I think<BR>  even record assignment and equality, but it is still a bit limiting.<BR>
<BR>Also, if I understand things correctly, this has long bothered me about Modula-3,<BR> though I'm more tolerant now -- Modula-3 doesn't seem to allow for lighter wieght<BR> objects. Like, small stack allocated structs with member functions. You seem to have<BR> to chose between heap allocated garbage collected virtual member functions full<BR> featured objects, or featureless dumb structs. It's nice how C++ allow hybrids --<BR> objects don't have to be heap allocated and member functions don't have be virtual.<BR> Or am I missing something?<BR>
<BR>Anyway, I've gotten to accept C a bit more vs. C++ so I can deal with<BR>t: Type;<BR>Type_DoSomething(t);<BR>
<BR>in place of:<BR>t.DoSomething();<BR>
 <BR>
 - Jay<BR><BR><br /><hr />Boo! Scare away worms, viruses and so much more! Try Windows Live OneCare! <a href='http://onecare.live.com/standard/en-us/purchase/trial.aspx?s_cid=wl_hotmailnews' target='_new'>Try now!</a></body>
</html>