<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
</style>
</head>
<body class='hmmessage'>
Yes, generating the headers is viable.<BR>
I thought I mentioned that a few times.<BR>
They could be generated in any build "that can".<BR>  i.e. a native build, that has a working C development system<BR>  and checked against the checked in ones.<BR>
 So then porting is: <BR>  copy the generator to new system, run it, copy results back, proceed <BR>
<BR> Maybe a good compromise. <BR> Not good for "embedded systems", but heck, is there any such thing<BR>  any longer? Doesn't everything have megs of RAM and gigs of persistant storage? :)<BR>
<BR>You don't need Scheme.<BR>
Just Quake + compiling and running C code.<BR>
Assuming a native build system.<BR>
I've done stuff in cross build systems like:<BR>
typedef struct foo_t {int i; int j; } foo_t;<BR>
extern const int xi = offsetof(foo_t, i);<BR>
 <BR>
compile that, and read the value of xi out of the .obj file.<BR>
 <BR>
 The .obj file reader was written in Perl. :) <BR>
  (Python not available.)<BR>
 but to do that here, I'd have to support multiple .obj file formats.<BR>
 <BR>
 - Jay<BR><BR>> To: jay.krell@cornell.edu<BR>> Date: Mon, 12 Jan 2009 01:34:24 -0800<BR>> From: mika@async.caltech.edu<BR>> CC: m3devel@elegosoft.com<BR>> Subject: Re: [M3devel] declaring a type's existance but not enough to instantiate it?<BR>> <BR>> <BR>> You present it as a true tragic Dilemma.<BR>> <BR>> But isn't there a Third Way---to wit, can't you "Ask the Computer"<BR>> to do the work for you?<BR>> <BR>> Generate the code somehow... Parsing the C headers is an obvious<BR>> way but there may be others that are simpler, such as writing a<BR>> Modula-3 program to generate the cloned M3 headers, sorry, interfaces.<BR>> <BR>> If I had to do this I would use my Scheme interpreter that's coded<BR>> in Modula-3 to write a Scheme program to generate the headers. This<BR>> program could pull whatever tricks are deemed necessary and suitable,<BR>> down to the point of generating and compiling and running C programs<BR>> as necessary (or parsing C code, or reading tea leaves). But the<BR>> end result would be a set of interfaces written in "Pure Modula-3".<BR>> The process of running the header generator would also have very<BR>> few dependencies on anything outside the M3 distribution.<BR>> <BR>> Mika<BR>> <BR>> Jay writes:<BR>> >--_6117a048-9185-4c03-badb-ef8f93402268_<BR>> >Content-Type: text/plain; charset="iso-8859-1"<BR>> >Content-Transfer-Encoding: quoted-printable<BR>> ><BR>> ><BR>> >This is what you "have to" chose between.<BR>> >Header cloning or C code (and C headers).<BR>> >=20<BR>> >CONST or VAR (or functions?)<BR>> >=20<BR>> >I'm going to likely make the Uerror change tonight.<BR>> >You can still veto it (er=2C vote against it :) )<BR>> >=20<BR>> >Possibly some convuluted C (enum/#undef)=2C or splitting the Modula-3<BR>> >at boundaries that weren't previously believed "natural".<BR>> >(See how SetupHandlers is ~two lines in Modula-3 and the rest in C=3B<BR>> >this is partly out of ignorance. I don't know how to write those<BR>> >two lines in C=3B and laziness=2C I didn't look into how).<BR>> >=20<BR>> >=20<BR>> >=20<BR>> >Remember I'm still staying away from mainstream platforms=2C<BR>> >so the value isn't what it might appear to be=2C but it is "stage setting"=<BR>> >=2C<BR>> >and the show might go on. :)<BR>> >=20<BR>> >=20<BR>> >Also=2C the dilemna does get more difficult now=2C with the little C header=<BR>> > cloning that remains.<BR>> >=20<BR>> >For example=2C look at Upthreads.i3.<BR>> >Mainly=2C look at function prototypes.<BR>> >Constants and types are "known problems".<BR>> >Prototypes are gray. They actually tend to be portable.<BR>> >=20<BR>> >For example:<BR>> >=20<BR>> >TYPE pid_t =3D INTEGER=3B<BR>> ><*EXTERNAL "m3_getpid*> PROCEDURE getpid():pid_t=3B<BR>> >=20<BR>> >or leave it alone?<BR>> >getpid is probably the worst example.<BR>> >It is so very portable declared in Modula-3.<BR>> >But still=2C imagine pid_t might be 16bits or 32 or 64.<BR>> >Writing a wrapper is more portable -- as long as the pid isn't stuff into s=<BR>> >ome record that the system defines.<BR>> >=20<BR>> >=20<BR>> >Again=2C Upthreads.i3.<BR>> >Would you like to see it reduced=2C or left alone?<BR>> >Only deal with the types and initializers=2C or also the prototypes?<BR>> >You know=2C I could write a little portable layer=2C where all the types ar=<BR>> >e pointers=2C always null initialized.<BR>> >It would buy /some/ portability=2C and cost some.<BR>> >=20<BR>> >=20<BR>> >Do you like the sem_t change? Partly? Not at all?<BR>> >There is one sem_t in the system. So I moved it to be in C code.<BR>> >Or=2C as I had it before=2C declared as the max size/align of all the platf=<BR>> >orms -- getting that right is the same work as getting it right "the old wa=<BR>> >y"=2C except if you make a mistake=2C odds are still good of it being ok.<BR>> >=20<BR>> >=20<BR>> >Should the line be drawn at generating the remaining headers=2C rather than=<BR>> > eliminating them?<BR>> >Uerror.i3 is easily generated. Good enough?<BR>> >=20<BR>> >Upthread.i3's types can be generated generally as records with opaque array=<BR>> >s with the right size and alignment.<BR>> >=20<BR>> >Other stuff can be generated or at least checked.<BR>> >e.g. to check that getpid is declared correctly=2C you can assign it to a f=<BR>> >unction pointer and see if that compiles.<BR>> >=20<BR>> >Perf on Uerror arguably doesn't matter.<BR>> >Is it only error handling code?Or do sockets often go down "error" paths=2C=<BR>> > because they are slow and you are waiting for more data?<BR>> >=20<BR>> >Anyway=2C point is=2C I agree for sure this is valuable=2C but I might be h=<BR>> >itting the "tail" of the approach and should switch=2C I'm not sure. I keep=<BR>> > saying that though=2C and then press further.<BR>> >=20<BR>> >=20<BR>> > - Jay<BR>> ><BR>> ><BR>> ><BR>> >From: hosking@cs.purdue.eduTo: jay.krell@cornell.eduDate: Mon=2C 12 Jan 200=<BR>> >9 19:24:50 +1100CC: m3devel@elegosoft.comSubject: Re: [M3devel] declaring a=<BR>> > type's existance but not enough to instantiate it?<BR>> ><BR>> ><BR>> >Point taken. We live in a C universe and so need to interact. I do think =<BR>> >your work with the headers is useful=2C and I want it to continue. Especia=<BR>> >lly in simplifying ports.<BR>> ><BR>> ><BR>> >On 12 Jan 2009=2C at 19:18=2C Jay wrote:<BR>> ><BR>> >I don't think a development system without C headers is interesting.. Is it=<BR>> > really? The transform I apply at times is wherever there is interaction wi=<BR>> >th C code that is described by system-dependent headers=2C or perhaps even =<BR>> >fairly system-independent headers outside the Modula-3 tree=2C either write=<BR>> > wrapper functions for the functionality in the headers (e.g. stat=2C waitp=<BR>> >id)=2C which can be done in a system-independent way=2C or move the Modula-=<BR>> >3<->C transition higher=2C which is also usually system-independent=2C e.g.=<BR>> > ThreadPThreadC_SetupHandlers. It is either that or clone the headers=2C wh=<BR>> >ich seems like the worse evil. There is always going to be a Modula-3<->C t=<BR>> >ransition=2C it is just a matter of where it occurs. - Jay<BR>> ><BR>> >CC: m3devel@elegosoft.comFrom: hosking@cs.purdue.eduTo: jay.krell@cornell.e=<BR>> >duSubject: Re: [M3devel] declaring a type's existance but not enough to ins=<BR>> >tantiate it?Date: Mon=2C 12 Jan 2009 12:32:15 +1100<BR>> ><BR>> ><BR>> >Jay=2C I really think you are bending over backwards too far just to be abl=<BR>> >e to shoe-horn things into C. I *like* having the transpar of C header fil=<BR>> >es expressed in Modula-3=2C *particularly* for system calls=2C where you mi=<BR>> >ght even be trying to build on a system that does not have the C header fil=<BR>> >es installed=2C even though the libraries exist and can be linked to. Fund=<BR>> >amentally=2C I think anytime the Modula-3 code is made less transparent you=<BR>> > should think hard about what you are doing. The same with the change of c=<BR>> >onstants to variables.<BR>> ><BR>> >I am getting very nervous that the changes you are making are destroying th=<BR>> >e clarity of the Modula-3 run-time code.<BR>> ><BR>> >In this particular case=2C you are wanting to use a Modula-3 parameter pass=<BR>> >ing mechanism on something that is not declared in Modula-3. Seems kind of=<BR>> > dubious to me. Also=2C I really don't like the idea of accessing external=<BR>> > variables in C.<BR>> ><BR>> >-- Tony<BR>> ><BR>> >On 12 Jan 2009=2C at 11:55=2C Jay wrote:<BR>> ><BR>> >I considered ADDRESS.However I think it still doesn't satisfy. I want to be=<BR>> > able to do this: TYPE Foo_t =3D something=3B<* EXTERNAL *> VAR Foo1=2C Foo=<BR>> >2:Foo_t=3B<* EXTERNAL *> PROCEDURE UseFoo(READONLY (* or VAR *) foo:Foo_t)=<BR>> >=3B (* Modula-3=2C not external *)PROCEDURE x()=3DBEGIN UseFoo(Foo1)=3B U=<BR>> >seFoo(Foo2)=3BEND x=3B AND I want any use of:VAR Foo3:Foo3_t=3B (* Modula-3=<BR>> >=2C not external *)to error. This is sem_t and sigset_t in particular. Poss=<BR>> >ibly renaming is the thing.They used to be declared in Modula-3=2C system-d=<BR>> >ependently=2C butI moved them to portable C. I could remove the types entir=<BR>> >ely and change UseFoo to take an address=2Cand declare mask and ackSem to b=<BR>> >e integers or I guess.<*EXTERNAL> VAR ackSem : RECORD END=3B That would sat=<BR>> >isfy but I thought it might be nicer to still provide the namedtypes to ref=<BR>> >er to the external variables. - Jay<BR>> ><BR>> >From: hosking@cs.purdue.eduTo: jay.krell@cornell.eduDate: Mon=2C 12 Jan 200=<BR>> >9 11:13:00 +1100CC: m3devel@elegosoft.comSubject: Re: [M3devel] declaring a=<BR>> > type's existance but not enough to instantiate it?What's wrong with using =<BR>> >ADDRESS for references to opaque values? If sigset_t is never instantiated=<BR>> > in Modula-3=2C then why do you need it declared there?<BR>> ><BR>> ><BR>> ><BR>> >Antony Hosking | Associate Professor | Computer Science | Purdue University<BR>> >305 N. University Street | West Lafayette | IN 47907 | USA<BR>> >Office +1 765 494 6001 | Mobile +1 765 427 5484<BR>> ><BR>> ><BR>> >On 12 Jan 2009=2C at 01:44=2C Jay wrote:<BR>> ><BR>> >Is there a way in Modula-3 to declare that a type exists=2C and there are <=<BR>> >*external*> instances of it=2C without "fully" declaring it=2C so that no M=<BR>> >odula-3 can instantiate it? I have done this for sigset_t and sem_t=2C but =<BR>> >they could erroneously be instantiated by Modula-3 and I'd like to remove t=<BR>> >hat ability to mess up so easily. (* This type is not declared correctly. I=<BR>> >t is only instantiated in C code. *) sigset_t =3D RECORD END=3B(* This typ=<BR>> >e is not declared correctly. It is only instantiated in C code. *) sem_t =<BR>> >=3D RECORD END=3BIn C I believe you can do this=2C like: typedef struct fo=<BR>> >o foo_t=3B extern foo_t foo=3B void UseFoo(foo_t*)=3B foo_t* GetFoo=<BR>> >(void)=3B Thanks=2C - Jay=<BR>> ><BR>> >--_6117a048-9185-4c03-badb-ef8f93402268_<BR>> >Content-Type: text/html; charset="iso-8859-1"<BR>> >Content-Transfer-Encoding: quoted-printable<BR>> ><BR>> ><html><BR>> ><head><BR>> ><style><BR>> >.hmmessage P<BR>> >{<BR>> >margin:0px=3B<BR>> >padding:0px<BR>> >}<BR>> >body.hmmessage<BR>> >{<BR>> >font-size: 10pt=3B<BR>> >font-family:Verdana<BR>> >}<BR>> ></style><BR>> ></head><BR>> ><body class=3D'hmmessage'><BR>> >This is what you "have to" chose between.<BR><BR>> >Header cloning or C code (and C headers).<BR><BR>> >&nbsp=3B<BR><BR>> >CONST or VAR (or functions?)<BR><BR>> >&nbsp=3B<BR><BR>> >I'm going to likely make the Uerror change tonight.<BR><BR>> >You can still veto it (er=2C vote against it :) )<BR><BR>> >&nbsp=3B<BR><BR>> >Possibly some convuluted C (enum/#undef)=2C or splitting the Modula-3<BR><BR>> >at boundaries that weren't previously believed "natural".<BR><BR>> >(See how SetupHandlers is ~two lines in Modula-3 and the rest in C=3B<BR><BR>> >this is partly out of ignorance. I don't know how to write those<BR><BR>> >two lines in C=3B and laziness=2C I didn't look into how).<BR><BR>> >&nbsp=3B<BR><BR>> >&nbsp=3B<BR><BR>> >&nbsp=3B<BR><BR>> >Remember I'm still staying away from mainstream platforms=2C<BR><BR>> >so the value isn't what it might appear to be=2C but it is "stage setting"=<BR>> >=2C<BR><BR>> >and the show might go on. :)<BR><BR>> >&nbsp=3B<BR><BR>> >&nbsp=3B<BR><BR>> >Also=2C the dilemna does get more difficult now=2C with the little C header=<BR>> > cloning that remains.<BR><BR>> >&nbsp=3B<BR><BR>> >For example=2C look at Upthreads.i3.<BR><BR>> >Mainly=2C look at function prototypes.<BR><BR>> >Constants and types are "known problems".<BR><BR>> >Prototypes are gray. They actually tend to be portable.<BR><BR>> >&nbsp=3B<BR><BR>> >For example:<BR><BR>> >&nbsp=3B<BR><BR>> >TYPE pid_t =3D INTEGER=3B<BR><BR>> >&lt=3B*EXTERNAL "m3_getpid*&gt=3B PROCEDURE getpid():pid_t=3B<BR><BR>> >&nbsp=3B<BR><BR>> >or leave it alone?<BR><BR>> >getpid is probably the worst example.<BR><BR>> >It is so very portable declared in Modula-3.<BR><BR>> >But still=2C imagine pid_t might be 16bits or 32 or 64.<BR><BR>> >Writing a wrapper is more portable -- as long as the pid isn't stuff into s=<BR>> >ome record that the system defines.<BR><BR>> >&nbsp=3B<BR><BR>> >&nbsp=3B<BR><BR>> >Again=2C Upthreads.i3.<BR><BR>> >Would you like to see it reduced=2C or left alone?<BR><BR>> >Only deal with the types and initializers=2C or also the prototypes?<BR><BR>> >You know=2C I could write a little portable layer=2C where all the types ar=<BR>> >e pointers=2C always null initialized.<BR><BR>> >It would buy /some/ portability=2C and cost some.<BR><BR>> >&nbsp=3B<BR><BR>> >&nbsp=3B<BR><BR>> >Do you like the sem_t change? Partly? Not at all?<BR><BR>> >There is one sem_t in the system. So I moved it to be in C code.<BR><BR>> >Or=2C as I had it before=2C declared as the max size/align of all the platf=<BR>> >orms -- getting that right is the same work as getting it right "the old wa=<BR>> >y"=2C except if you make a mistake=2C odds are still good of it being ok.<B=<BR>> >R><BR>> >&nbsp=3B<BR><BR>> >&nbsp=3B<BR><BR>> >Should the line be drawn at generating the remaining headers=2C rather than=<BR>> > eliminating them?<BR><BR>> >Uerror.i3 is easily generated. Good enough?<BR><BR>> >&nbsp=3B<BR><BR>> >Upthread.i3's types can be generated generally as records with opaque array=<BR>> >s with the right size and alignment.<BR><BR>> >&nbsp=3B<BR><BR>> >Other stuff can be generated or at least checked.<BR><BR>> >e.g. to check that getpid is declared correctly=2C you can assign it to a f=<BR>> >unction pointer and see if that compiles.<BR><BR>> >&nbsp=3B<BR><BR>> >Perf on Uerror arguably doesn't matter.<BR><BR>> >Is it only error handling code?<BR>Or do sockets often go down "error" path=<BR>> >s=2C because they are slow and you are waiting for more data?<BR><BR>> >&nbsp=3B<BR><BR>> >Anyway=2C point is=2C I agree for sure this is valuable=2C but I might be h=<BR>> >itting the "tail" of the approach and should switch=2C I'm not sure. I keep=<BR>> > saying that though=2C and then press further.<BR><BR>> >&nbsp=3B<BR><BR>> >&nbsp=3B<BR><BR>> >&nbsp=3B- Jay<BR><BR><BR>> ><BR>> ><HR id=3DstopSpelling><BR>> <BR><BR>> >From: hosking@cs.purdue.edu<BR>To: jay.krell@cornell.edu<BR>Date: Mon=2C 12=<BR>> > Jan 2009 19:24:50 +1100<BR>CC: m3devel@elegosoft.com<BR>Subject: Re: [M3de=<BR>> >vel] declaring a type's existance but not enough to instantiate it?<BR><BR>=<BR>> ><BR><BR>> ><DIV><SPAN class=3DEC_Apple-style-span style=3D"WORD-SPACING: 0px=3B FONT: =<BR>> >12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-IND=<BR>> >ENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPS=<BR>> >E: separate"><BR>> ><DIV style=3D"WORD-WRAP: break-word"><SPAN class=3DEC_Apple-style-span styl=<BR>> >e=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B C=<BR>> >OLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-S=<BR>> >PACING: normal=3B BORDER-COLLAPSE: separate"><SPAN class=3DEC_Apple-style-s=<BR>> >pan style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: n=<BR>> >one=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B =<BR>> >LETTER-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN class=3DEC_Apple=<BR>> >-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRAN=<BR>> >SFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: no=<BR>> >rmal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN class=3D=<BR>> >EC_Apple-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B T=<BR>> >EXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-S=<BR>> >PACE: normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN =<BR>> >class=3DEC_Apple-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvet=<BR>> >ica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B=<BR>> > WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separate=<BR>> >"><SPAN class=3DEC_Apple-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12p=<BR>> >x Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT=<BR>> >: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: =<BR>> >separate"><SPAN class=3DEC_Apple-style-span style=3D"WORD-SPACING: 0px=3B F=<BR>> >ONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEX=<BR>> >T-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-CO=<BR>> >LLAPSE: separate"><SPAN class=3DEC_Apple-style-span style=3D"WORD-SPACING: =<BR>> >0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0=<BR>> >)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B B=<BR>> >ORDER-COLLAPSE: separate"><BR>> ><DIV>Point taken. &nbsp=3BWe live in a C universe and so need to interact. =<BR>> >&nbsp=3BI do think your work with the headers is useful=2C and I want it to=<BR>> > continue. &nbsp=3BEspecially in simplifying ports.</DIV><BR>> ><DIV><BR></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DI=<BR>> >V></SPAN></DIV><BR>> ><DIV><BR>> ><DIV>On 12 Jan 2009=2C at 19:18=2C Jay wrote:</DIV><BR class=3DEC_Apple-int=<BR>> >erchange-newline><BR>> ><BLOCKQUOTE><SPAN class=3DEC_Apple-style-span style=3D"WORD-SPACING: 0px=3B=<BR>> > FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B T=<BR>> >EXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-=<BR>> >COLLAPSE: separate"><BR>> ><DIV class=3DEC_hmmessage style=3D"FONT-SIZE: 10pt=3B FONT-FAMILY: Verdana"=<BR>> >>I don't think a development system without C headers is interesting.. Is i=<BR>> >t really?<BR>&nbsp=3B<BR>The transform I apply at times is wherever there i=<BR>> >s interaction with C code that is described by system-dependent headers=2C =<BR>> >or perhaps even fairly system-independent headers outside the Modula-3 tree=<BR>> >=2C either write wrapper functions for the functionality in the headers (e.=<BR>> >g. stat=2C waitpid)=2C which&nbsp=3Bcan be done in a system-independent way=<BR>> >=2C&nbsp=3Bor move the Modula-3&lt=3B-&gt=3BC transition higher=2C which is=<BR>> > also usually system-independent=2C e.g. ThreadPThreadC_SetupHandlers.<BR>&=<BR>> >nbsp=3B<BR>It is either that or clone the headers=2C which seems like the w=<BR>> >orse evil.<BR>&nbsp=3B<BR>There is always going to be a Modula-3&lt=3B-&gt=<BR>> >=3BC transition=2C it is just a matter of where it occurs.<BR>&nbsp=3B<BR>&=<BR>> >nbsp=3B- Jay<BR><BR><BR>> ><HR id=3DEC_stopSpelling><BR>> ><BR>CC:<SPAN class=3DEC_Apple-converted-space>&nbsp=3B</SPAN><A href=3D"mai=<BR>> >lto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>From:<SPAN class=3D=<BR>> >EC_Apple-converted-space>&nbsp=3B</SPAN><A href=3D"mailto:hosking@cs.purdue=<BR>> >.edu">hosking@cs.purdue.edu</A><BR>To:<SPAN class=3DEC_Apple-converted-spac=<BR>> >e>&nbsp=3B</SPAN><A href=3D"mailto:jay.krell@cornell.edu">jay.krell@cornell=<BR>> >.edu</A><BR>Subject: Re: [M3devel] declaring a type's existance but not eno=<BR>> >ugh to instantiate it?<BR>Date: Mon=2C 12 Jan 2009 12:32:15 +1100<BR><BR><B=<BR>> >R><BR>> <DIV><SPAN class=3DEC_EC_Apple-style-span style=3D"WORD-SPACING: 0px=3B FON=<BR>> >T: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-=<BR>> >INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-COLL=<BR>> >APSE: separate"><BR>> ><DIV style=3D"WORD-WRAP: break-word"><SPAN class=3DEC_EC_Apple-style-span s=<BR>> >tyle=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=<BR>> >=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LET=<BR>> >TER-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN class=3DEC_EC_Apple=<BR>> >-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRAN=<BR>> >SFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: no=<BR>> >rmal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN class=3D=<BR>> >EC_EC_Apple-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=<BR>> >=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WH=<BR>> >ITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separate"><=<BR>> >SPAN class=3DEC_EC_Apple-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12p=<BR>> >x Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT=<BR>> >: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: =<BR>> >separate"><SPAN class=3DEC_EC_Apple-style-span style=3D"WORD-SPACING: 0px=<BR>> >=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=<BR>> >=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BO=<BR>> >RDER-COLLAPSE: separate"><SPAN class=3DEC_EC_Apple-style-span style=3D"WORD=<BR>> >-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb=<BR>> >(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: n=<BR>> >ormal=3B BORDER-COLLAPSE: separate"><SPAN class=3DEC_EC_Apple-style-span st=<BR>> >yle=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B=<BR>> > COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER=<BR>> >-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN class=3DEC_EC_Apple-st=<BR>> >yle-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFO=<BR>> >RM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: norma=<BR>> >l=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separate"><BR>> ><DIV>Jay=2C I really think you are bending over backwards too far just to b=<BR>> >e able to shoe-horn things into C. &nbsp=3BI *like* having the transpar of =<BR>> >C header files expressed in Modula-3=2C *particularly* for system calls=2C =<BR>> >where you might even be trying to build on a system that does not have the =<BR>> >C header files installed=2C even though the libraries exist and can be link=<BR>> >ed to. &nbsp=3BFundamentally=2C I think anytime the Modula-3 code is made l=<BR>> >ess transparent you should think hard about what you are doing. &nbsp=3BThe=<BR>> > same with the change of constants to variables.</DIV><BR>> ><DIV><BR></DIV><BR>> ><DIV>I am getting very nervous that the changes you are making are destroyi=<BR>> >ng the clarity of the Modula-3 run-time code.</DIV><BR>> ><DIV><BR></DIV><BR>> ><DIV>In this particular case=2C you are wanting to use a Modula-3 parameter=<BR>> > passing mechanism on something that is not declared in Modula-3. &nbsp=3BS=<BR>> >eems kind of dubious to me. &nbsp=3BAlso=2C I really don't like the idea of=<BR>> > accessing external variables in C.</DIV><BR>> ><DIV><BR></DIV><BR>> ><DIV>-- Tony</DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><=<BR>> >/DIV></SPAN></DIV><BR><BR>> ><DIV><BR>> ><DIV>On 12 Jan 2009=2C at 11:55=2C Jay wrote:</DIV><BR class=3DEC_EC_Apple-=<BR>> >interchange-newline><BR>> ><BLOCKQUOTE><SPAN class=3DEC_EC_Apple-style-span style=3D"WORD-SPACING: 0px=<BR>> >=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=<BR>> >=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BO=<BR>> >RDER-COLLAPSE: separate"><BR>> ><DIV class=3DEC_EC_hmmessage style=3D"FONT-SIZE: 10pt=3B FONT-FAMILY: Verda=<BR>> >na">I considered ADDRESS.<BR>However I think it still doesn't satisfy.<BR>&=<BR>> >nbsp=3B<BR>I want to be able to do this:<BR>&nbsp=3B<BR>TYPE&nbsp=3BFoo_t =<BR>> >=3D something=3B<BR>&lt=3B* EXTERNAL *&gt=3B VAR Foo1=2C Foo2:Foo_t=3B<BR>&=<BR>> >lt=3B* EXTERNAL *&gt=3B PROCEDURE&nbsp=3BUseFoo(READONLY (* or VAR *) foo:F=<BR>> >oo_t)=3B<BR>&nbsp=3B<BR>(* Modula-3=2C not external *)<BR>PROCEDURE x()=3D<=<BR>> >BR>BEGIN<BR>&nbsp=3B UseFoo(Foo1)=3B<BR>&nbsp=3B UseFoo(Foo2)=3B<BR>END x=<BR>> >=3B<BR>&nbsp=3B<BR>AND I want any use of:<BR>VAR Foo3:Foo3_t=3B (* Modula-3=<BR>> >=2C not external *)<BR><BR>to error. This is sem_t and sigset_t in particul=<BR>> >ar.<BR>&nbsp=3B<BR>Possibly renaming is the thing.<BR>They used to be decla=<BR>> >red in Modula-3=2C system-dependently=2C but<BR>I moved them to portable C.=<BR>> ><BR>&nbsp=3B<BR>I could remove the types entirely and change UseFoo to take=<BR>> > an address=2C<BR>and declare mask and ackSem to be integers or I guess.<BR=<BR>> >>&lt=3B*EXTERNAL&gt=3B VAR ackSem&nbsp=3B: RECORD END=3B<BR>&nbsp=3B<BR>Tha=<BR>> >t would satisfy but I thought it might be nicer to still provide the named<=<BR>> >BR>types to refer to the external variables.<BR>&nbsp=3B<BR>&nbsp=3B- Jay<B=<BR>> >R><BR><BR>> ><HR id=3DEC_EC_stopSpelling><BR>> ><BR>From:<SPAN class=3DEC_EC_Apple-converted-space>&nbsp=3B</SPAN><A href=<BR>> >=3D"mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>To:<SPAN cla=<BR>> >ss=3DEC_EC_Apple-converted-space>&nbsp=3B</SPAN><A href=3D"mailto:jay.krell=<BR>> >@cornell.edu">jay.krell@cornell.edu</A><BR>Date: Mon=2C 12 Jan 2009 11:13:0=<BR>> >0 +1100<BR>CC:<SPAN class=3DEC_EC_Apple-converted-space>&nbsp=3B</SPAN><A h=<BR>> >ref=3D"mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: =<BR>> >Re: [M3devel] declaring a type's existance but not enough to instantiate it=<BR>> >?<BR><BR>What's wrong with using ADDRESS for references to opaque values? &=<BR>> >nbsp=3BIf sigset_t is never instantiated in Modula-3=2C then why do you nee=<BR>> >d it declared there?<BR><BR>> ><DIV><BR><BR>> ><DIV><SPAN class=3DEC_EC_EC_Apple-style-span style=3D"WORD-SPACING: 0px=3B =<BR>> >FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TE=<BR>> >XT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-C=<BR>> >OLLAPSE: separate"><BR>> ><DIV style=3D"WORD-WRAP: break-word"><SPAN class=3DEC_EC_EC_Apple-style-spa=<BR>> >n style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: non=<BR>> >e=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LE=<BR>> >TTER-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN class=3DEC_EC_EC_A=<BR>> >pple-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-=<BR>> >TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE=<BR>> >: normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN clas=<BR>> >s=3DEC_EC_EC_Apple-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helv=<BR>> >etica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=<BR>> >=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separ=<BR>> >ate"><SPAN class=3DEC_EC_EC_Apple-style-span style=3D"WORD-SPACING: 0px=3B =<BR>> >FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TE=<BR>> >XT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-C=<BR>> >OLLAPSE: separate"><SPAN class=3DEC_EC_EC_Apple-style-span style=3D"WORD-SP=<BR>> >ACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=<BR>> >=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: nor=<BR>> >mal=3B BORDER-COLLAPSE: separate"><SPAN class=3DEC_EC_EC_Apple-style-span s=<BR>> >tyle=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=<BR>> >=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LET=<BR>> >TER-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN class=3DEC_EC_EC_Ap=<BR>> >ple-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helvetica=3B TEXT-T=<BR>> >RANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=3B WHITE-SPACE:=<BR>> > normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separate"><SPAN class=<BR>> >=3DEC_EC_EC_Apple-style-span style=3D"WORD-SPACING: 0px=3B FONT: 12px Helve=<BR>> >tica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0)=3B TEXT-INDENT: 0px=<BR>> >=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B BORDER-COLLAPSE: separ=<BR>> >ate"><BR>> ><DIV><FONT class=3DEC_EC_EC_Apple-style-span color=3D#0000ff><FONT class=3D=<BR>> >EC_EC_EC_Apple-style-span face=3D"Gill Sans"><SPAN class=3DEC_EC_EC_Apple-s=<BR>> >tyle-span style=3D"COLOR: rgb(0=2C0=2C255)=3B FONT-FAMILY: 'Gill Sans'"><SP=<BR>> >AN class=3DEC_EC_EC_Apple-style-span style=3D"COLOR: rgb(0=2C0=2C255)=3B FO=<BR>> >NT-FAMILY: 'Gill Sans'">Antony Hosking</SPAN></SPAN></FONT></FONT><FONT cla=<BR>> >ss=3DEC_EC_EC_Apple-style-span face=3D"Gill Sans"><SPAN class=3DEC_EC_EC_Ap=<BR>> >ple-style-span style=3D"FONT-FAMILY: 'Gill Sans'"><SPAN class=3DEC_EC_EC_Ap=<BR>> >ple-style-span style=3D"FONT-FAMILY: 'Gill Sans'"><SPAN class=3DEC_EC_Apple=<BR>> >-converted-space>&nbsp=3B</SPAN>|<SPAN class=3DEC_EC_Apple-converted-space>=<BR>> >&nbsp=3B</SPAN></SPAN></SPAN><SPAN class=3DEC_EC_EC_Apple-style-span style=<BR>> >=3D"FONT-FAMILY: 'Gill Sans'"><SPAN class=3DEC_EC_EC_Apple-style-span style=<BR>> >=3D"FONT-FAMILY: 'Gill Sans'">Associate Professor</SPAN></SPAN><SPAN class=<BR>> >=3DEC_EC_EC_Apple-style-span style=3D"FONT-FAMILY: 'Gill Sans'"><SPAN class=<BR>> >=3DEC_EC_EC_Apple-style-span style=3D"FONT-FAMILY: 'Gill Sans'">&nbsp=3B| C=<BR>> >omputer Science | Purdue University</SPAN></SPAN></FONT></DIV><BR>> ><DIV><FONT class=3DEC_EC_EC_Apple-style-span face=3DGillSans-Light><SPAN cl=<BR>> >ass=3DEC_EC_EC_Apple-style-span style=3D"FONT-FAMILY: GillSans-Light">305 N=<BR>> >. University Street | West Lafayette | IN 47907 | USA</SPAN></FONT></DIV><BR>> ><DIV><FONT class=3DEC_EC_EC_Apple-style-span face=3D"Gill Sans" color=3D#00=<BR>> >00ff><SPAN class=3DEC_EC_EC_Apple-style-span style=3D"COLOR: rgb(0=2C0=2C25=<BR>> >5)=3B FONT-FAMILY: 'Gill Sans'"><SPAN class=3DEC_EC_EC_Apple-style-span sty=<BR>> >le=3D"COLOR: rgb(0=2C0=2C255)=3B FONT-FAMILY: 'Gill Sans'">Office</SPAN></S=<BR>> >PAN></FONT><FONT class=3DEC_EC_EC_Apple-style-span face=3DGillSans-Light><S=<BR>> >PAN class=3DEC_EC_EC_Apple-style-span style=3D"FONT-FAMILY: GillSans-Light"=<BR>> >><SPAN class=3DEC_EC_EC_Apple-style-span style=3D"FONT-FAMILY: GillSans-Lig=<BR>> >ht">&nbsp=3B+1 765 494 6001 |<SPAN class=3DEC_EC_Apple-converted-space>&nbs=<BR>> >p=3B</SPAN></SPAN></SPAN></FONT><FONT class=3DEC_EC_EC_Apple-style-span fac=<BR>> >e=3D"Gill Sans" color=3D#0000ff><SPAN class=3DEC_EC_EC_Apple-style-span sty=<BR>> >le=3D"COLOR: rgb(0=2C0=2C255)=3B FONT-FAMILY: 'Gill Sans'"><SPAN class=3DEC=<BR>> >_EC_EC_Apple-style-span style=3D"COLOR: rgb(0=2C0=2C255)=3B FONT-FAMILY: 'G=<BR>> >ill Sans'">Mobile</SPAN></SPAN></FONT><FONT class=3DEC_EC_EC_Apple-style-sp=<BR>> >an face=3DGillSans-Light><SPAN class=3DEC_EC_EC_Apple-style-span style=3D"F=<BR>> >ONT-FAMILY: GillSans-Light"><SPAN class=3DEC_EC_EC_Apple-style-span style=<BR>> >=3D"FONT-FAMILY: GillSans-Light"><SPAN class=3DEC_EC_Apple-converted-space>=<BR>> >&nbsp=3B</SPAN>+1 765 427 5484</SPAN></SPAN></FONT></DIV><BR>> ><DIV><FONT class=3DEC_EC_EC_Apple-style-span face=3DGillSans-Light><BR clas=<BR>> >s=3DEC_EC_EC_khtml-block-placeholder></FONT></DIV></SPAN></SPAN></SPAN></SP=<BR>> >AN></SPAN></SPAN></SPAN><BR class=3DEC_EC_EC_Apple-interchange-newline></SP=<BR>> >AN></DIV></SPAN></DIV><BR><BR>> ><DIV><BR>> ><DIV>On 12 Jan 2009=2C at 01:44=2C Jay wrote:</DIV><BR class=3DEC_EC_EC_App=<BR>> >le-interchange-newline><BR>> ><BLOCKQUOTE><SPAN class=3DEC_EC_EC_Apple-style-span style=3D"WORD-SPACING: =<BR>> >0px=3B FONT: 12px Helvetica=3B TEXT-TRANSFORM: none=3B COLOR: rgb(0=2C0=2C0=<BR>> >)=3B TEXT-INDENT: 0px=3B WHITE-SPACE: normal=3B LETTER-SPACING: normal=3B B=<BR>> >ORDER-COLLAPSE: separate"><BR>> ><DIV class=3DEC_EC_EC_hmmessage style=3D"FONT-SIZE: 10pt=3B FONT-FAMILY: Ve=<BR>> >rdana">Is there a way in Modula-3 to declare that&nbsp=3Ba type exists=2C a=<BR>> >nd there are &lt=3B*external*&gt=3B instances of it=2C without "fully" decl=<BR>> >aring it=2C so that no Modula-3 can instantiate it?<BR>&nbsp=3B<BR>I have d=<BR>> >one this for sigset_t and sem_t=2C but they could erroneously be instantiat=<BR>> >ed by Modula-3 and I'd like to remove that ability to mess up so easily.<BR=<BR>> >>&nbsp=3B<BR>(* This type is not declared correctly. It is only instantiate=<BR>> >d in C code. *)<BR>&nbsp=3B sigset_t =3D RECORD END=3B<BR><BR>(* This type =<BR>> >is not declared correctly. It is only instantiated in C code. *)<BR>&nbsp=<BR>> >=3B sem_t =3D RECORD END=3B<BR><BR>In C I believe you can do this=2C like:<=<BR>> >BR>&nbsp=3B&nbsp=3Btypedef struct foo foo_t=3B&nbsp=3B<SPAN class=3DEC_EC_E=<BR>> >C_Apple-converted-space>&nbsp=3B</SPAN><BR>&nbsp=3B&nbsp=3Bextern foo_t foo=<BR>> >=3B&nbsp=3B<SPAN class=3DEC_EC_EC_Apple-converted-space>&nbsp=3B</SPAN><BR>=<BR>> >&nbsp=3B<BR>&nbsp=3Bvoid UseFoo(foo_t*)=3B<SPAN class=3DEC_EC_EC_Apple-conv=<BR>> >erted-space>&nbsp=3B</SPAN><BR>&nbsp=3B foo_t* GetFoo(void)=3B<SPAN class=<BR>> >=3DEC_EC_EC_Apple-converted-space>&nbsp=3B</SPAN><BR>&nbsp=3B<BR>Thanks=2C<=<BR>> >BR>&nbsp=3B- Jay<BR><BR><BR><BR></DIV></SPAN></BLOCKQUOTE></DIV><BR></DIV><=<BR>> >/DIV></SPAN><BR class=3DEC_EC_Apple-interchange-newline></BLOCKQUOTE></DIV>=<BR>> ><BR></DIV></SPAN><BR class=3DEC_Apple-interchange-newline></BLOCKQUOTE></DI=<BR>> >V><BR></body><BR>> ></html>=<BR>> ><BR>> >--_6117a048-9185-4c03-badb-ef8f93402268_--<BR><BR></body>
</html>