Update docs

This commit is contained in:
Bruce Hill 2024-08-19 00:38:41 -04:00
parent b272c8e38d
commit 0bea662bfb

View File

@ -11,51 +11,54 @@ segments its imports into different namespaces. For example `Foo$Baz` would be
the identifier `Baz` in the namespace `Foo`, and would be guaranteed to not
collide with a user-chosen name like `FooBaz`.
```
// File: foo.nl
```tomo
// File: foo.tm
my_var := 123
struct Baz(x:Int):
member := 5
func frob(b:Baz)->Int:
return b.x
qux := "Loaded!"
say(qux)
// File: foo.nl.h
...
typedef struct foo$Baz_s foo$Baz_t;
#define foo$Baz(...) (foo$Baz_t){__VA_ARGS__}
struct foo$Baz_s {
Int_t x;
};
extern Int_t foo$Baz$member;
Int_t foo$Baz$frob(foo$Baz_t b);
...
// File: foo.nl.c
#include "foo.nl.h"
Int_t foo$Baz$member = 5;
Int_t foo$Baz$frob(foo$Baz_t b) {
return b.x;
}
void use$foo(void) {
static enum {UNLOADED, LOADING, LOADED} $state = UNLOADED;
if ($state == LOADING)
fail("Circular import");
else if ($state == LOADED)
return;
$state = LOADING;
{ // Top-level code:
Str qux = "Loaded!";
say(qux);
}
$state = LOADED;
}
```
And on the usage site, the code `use ./foo.tm` compiles to `#include
```C
// File: foo.tm.h
...
typedef struct foo$Baz_s foo$Baz_t;
struct foo$Baz_s {
Int_t $x;
};
extern Int_t foo$my_var;
extern const TypeInfo foo$Baz;
extern Int_t foo$Baz$member;
Int_t foo$Baz$frob(struct foo$Baz_s $b);
void foo$main();
...
```
```C
// File: foo.tm.c
...
Int_t foo$my_var = I_small(123);
Int_t foo$Baz$member = I_small(5);
static CORD foo$Baz$as_text(foo$Baz_t *obj, bool use_color)
{
if (!obj)
return "Baz";
return CORD_all(use_color ? "\x1b[0;1mBaz\x1b[m(" : "Baz(", "x=",
Int$as_text(stack(obj->$x), use_color, &$Int), ")");
}
public Int_t foo$Baz$frob(struct foo$Baz_s $b)
{
return ($b).$x;
}
...
```
And on the usage site, the code `include ./foo.tm` compiles to `#include
"./foo.tm.h"` in the header and `use$foo()` in the code that is executed.