[M3devel] declaring a type's existance but not enough to instantiate it?

Jay jay.krell at cornell.edu
Mon Jan 12 01:55:16 CET 2009


I considered ADDRESS.
However I think it still doesn't satisfy.
 
I want to be able to do this:
 
TYPE Foo_t = something;
<* EXTERNAL *> VAR Foo1, Foo2:Foo_t;
<* EXTERNAL *> PROCEDURE UseFoo(READONLY (* or VAR *) foo:Foo_t);
 
(* Modula-3, not external *)
PROCEDURE x()=
BEGIN
  UseFoo(Foo1);
  UseFoo(Foo2);
END x;
 
AND I want any use of:
VAR Foo3:Foo3_t; (* Modula-3, not external *)
to error. This is sem_t and sigset_t in particular.
 
Possibly renaming is the thing.
They used to be declared in Modula-3, system-dependently, but
I moved them to portable C.
 
I could remove the types entirely and change UseFoo to take an address,
and declare mask and ackSem to be integers or I guess.
<*EXTERNAL> VAR ackSem : RECORD END;
 
That would satisfy but I thought it might be nicer to still provide the named
types to refer to the external variables.
 
 - Jay



From: hosking at cs.purdue.eduTo: jay.krell at cornell.eduDate: Mon, 12 Jan 2009 11:13:00 +1100CC: m3devel at elegosoft.comSubject: Re: [M3devel] declaring a type's existance but not enough to instantiate it?What's wrong with using ADDRESS for references to opaque values?  If sigset_t is never instantiated in Modula-3, then why do you need it declared there?



Antony Hosking | Associate Professor | Computer Science | Purdue University
305 N. University Street | West Lafayette | IN 47907 | USA
Office +1 765 494 6001 | Mobile +1 765 427 5484


On 12 Jan 2009, at 01:44, Jay wrote:

Is there a way in Modula-3 to declare that a type exists, and there are <*external*> instances of it, without "fully" declaring it, so that no Modula-3 can instantiate it? I have done this for sigset_t and sem_t, but they could erroneously be instantiated by Modula-3 and I'd like to remove that ability to mess up so easily. (* This type is not declared correctly. It is only instantiated in C code. *)  sigset_t = RECORD END;(* This type is not declared correctly. It is only instantiated in C code. *)  sem_t = RECORD END;In C I believe you can do this, like:  typedef struct foo foo_t;    extern foo_t foo;    void UseFoo(foo_t*);   foo_t* GetFoo(void);  Thanks, - Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20090112/d88b960f/attachment-0002.html>


More information about the M3devel mailing list