From 0bea662bfb33999ad10282fff51f7ec3c22463b1 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Mon, 19 Aug 2024 00:38:41 -0400 Subject: [PATCH] Update docs --- docs/namespacing.md | 83 +++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/docs/namespacing.md b/docs/namespacing.md index 91a8d47..381956d 100644 --- a/docs/namespacing.md +++ b/docs/namespacing.md @@ -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.