<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
Chris, I'm not sure I understand.<BR>
 <BR>
 <BR>
Is the result "in misc", or is it constant relative to the program's lifetime?<BR>
Or is it initialized on-demand and then constant from then on?<BR>
 <BR>
 <BR>
There are a few instances where "constants" are initialized in Modula-3 module initializers.<BR>
They are "VAR" from a technical point of view, in the .i3 file, but then VAR is immediately preceded by a comment that they are CONST.<BR>
  I do something similar in m3core/unix, except the data is actually const/static initialized in C code. I do that to avoid duplicating header content. Header content can be duplicated, if it is fairly portable and stable, only needs to be duplicated once, easy to get correct, and stay correct. The particular problem in m3core/unix is portability -- the header content would have to be duplicated differently for every target. Incorrectly duplicated C headers silently violate safety (see below).<BR>
 <BR>
 <BR>
You should try to provide a SAFE interface, so that client code can be SAFE.<BR>
And then, you are responsible for upholding what that means.<BR>
  Your module implementation might be UNSAFE.<BR>
  But clients must be protected from a "certain class of bug".<BR>
  For example, a claimed-to-be SAFE interface cannot expose stdlib/free() because a client could double free.<BR>
  This is an easy thing to mess up and it is very unfortunate when it is.<BR>
   It is roughly equivalent to bugs in the compiler or garbage collector.<BR>
 <BR>
 <BR>
 - Jay<BR> <BR>> From: Highjinks@gmx.com<BR>> To: m3devel@elegosoft.com<BR>> Date: Fri, 12 Mar 2010 01:35:25 +0100<BR>> Subject: [M3devel] Constant to Constant?<BR>> <BR>> <BR>> Things are progressing here, slowly but steadily.<BR>> <BR>> I'm curious...<BR>> <BR>> When writing an interface for something like this ...<BR>> <BR>> /* C Type */<BR>> const C_Foo_t *Bar = get_foo_data(misc);<BR>> <BR>> Is it better to do it this way...<BR>> <BR>> <* EXTERNAL get_foo_data:C *><BR>> TYPE Foo_Data = PROCEDURE(get_foo_data(somemisc : misctype) : C_Foo_t;<BR>> <BR>> Or should I just do...<BR>> UNSAFE INTERFACE Foo;<BR>> <BR>> (* Translating the C typedef struct over to Modula3 code. *)<BR>> TYPE C_Foo_T = UNTRACED REF RECORD .... END;<BR>> <BR>> <* EXTERNAL get_foo_data:C *><BR>> PROCEDURE get_foo_data(somemisc : misctype) : C_foo_t;<BR>> END Foo.<BR>> <BR>> Main.m3<BR>> IMPORT Foo;<BR>> Foo_Data := Foo.get_foo_data(Misc);<BR>> END Main. <BR>> <BR>> C_Foo_t is known, and has a Modula 3 representation in the Interface. But as the C Code shows, it has to be a constant value.<BR>> <BR>> What's the best way to do this without hosing the Interface for everyone else that might want to use it? Variable expressions are no problem, it's making it a constant that's giving me trouble. It's constant because the data structure is managed by the supporting library, not by the Modula3 Code.<BR>> <BR>> Tips...pointers?<BR>> <BR>> -- <BR>> Chris <Highjinks@gmx.com><BR>                                      </body>
</html>