From a42ade4bead8adbf0aa4c140bf0a01e40961eaa1 Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Wed, 30 Apr 2025 15:07:43 +0000 Subject: [PATCH] checkpoint separating out TM implementations --- "developer/cc\360\237\226\211/Binding.lib.c" | 98 --- "developer/cc\360\237\226\211/Core.lib.c" | 26 +- .../ParameterConnector.lib.c" | 74 +++ "developer/cc\360\237\226\211/TM.lib.c" | 565 +---------------- .../cc\360\237\226\211/TM\302\267Array.lib.c" | 243 +++++++ .../TM\302\267SingletonCircle.lib.c" | 182 ++++++ .../TM\302\267SingletonSegment.lib.c" | 178 ++++++ .../TM\302\267ZeroLength.lib.c" | 180 ++++++ "developer/cc\360\237\226\211/cpp_ext.c" | 1 - "developer/cc\360\237\226\211/cpp_ext_0.c" | 10 +- .../deprecated\360\237\226\211/Map.lib.c" | 0 .../deprecated\360\237\226\211/Map2.lib.c" | 0 .../deprecated\360\237\226\211/scatch.c" | 0 .../document\360\237\226\211/Binding.org" | 170 +++++ .../document\360\237\226\211/FG_tables.org" | 113 ++++ .../TapeMachine_howto.org" | 145 +++++ .../parameterized_functions.org" | 120 ++++ .../source_file_sectioins.org" | 107 ++++ .../template_in_C.org" | 83 +++ developer/example/0_readme.org | 8 +- developer/example/bespoke.cli.c | 2 +- developer/example/try_TM_1-6.transcript | 274 ++++++++ developer/example/try_TM_1.cli.c | 10 +- developer/example/try_TM_2.cli.c | 8 +- developer/example/try_TM_3.cli.c | 8 +- developer/example/try_TM_4.cli.c | 10 +- developer/example/try_TM_5.cli.c | 4 +- developer/example/try_TM_6.cli.c | 4 +- developer/example_cpp/example_A.transcript | 19 + developer/example_cpp/example_eval.c | 15 +- developer/example_cpp/example_eval.transcript | 10 + developer/example_cpp/example_grow.c | 29 - developer/example_cpp/example_grow.transcript | 26 + .../example_cpp/example_grow2.transcript | 16 + .../example_cpp/example_recurse.transcript | 27 + developer/example_cpp/try_ext_0.transcript | 75 +++ developer/example_cpp/try_ext_1.c | 46 -- developer/example_cpp/try_ext_1.transcript | 97 +++ developer/experiment/letter_all.c | 175 +++++ .../{try_letters_2.c => letter_delta.c} | 0 developer/experiment/letter_lm_rm_1.c | 11 + developer/experiment/letter_lm_rm_2.c | 14 + developer/experiment/letter_lm_rm_3.c | 21 + developer/experiment/letter_lm_rm_4.c | 18 + developer/experiment/letter_minus.c | 17 + .../experiment/{try_letters.c => letter_mu.c} | 0 .../{try_letters_3.c => letter_theta.c} | 0 developer/experiment/temp | 6 + "developer/tool\360\237\226\211/makefile" | 8 +- "document\360\237\226\211/#temp.txt#" | 93 +++ .../Abstracting_Type_in_C.org" | 68 +- .../Abstracting_Type_in_C.pdf" | Bin 211829 -> 0 bytes .../Abstracting_Type_in_C.tex" | 596 ------------------ "document\360\237\226\211/RT_C_namespace.org" | 179 +++++- "document\360\237\226\211/temp.txt" | 90 +++ tool_shared/third_party/RT-project-share | 2 +- tool_shared/third_party/emacs_30.0.92 | 2 +- 57 files changed, 2848 insertions(+), 1435 deletions(-) delete mode 100644 "developer/cc\360\237\226\211/Binding.lib.c" create mode 100644 "developer/cc\360\237\226\211/ParameterConnector.lib.c" create mode 100644 "developer/cc\360\237\226\211/TM\302\267Array.lib.c" create mode 100644 "developer/cc\360\237\226\211/TM\302\267SingletonCircle.lib.c" create mode 100644 "developer/cc\360\237\226\211/TM\302\267SingletonSegment.lib.c" create mode 100644 "developer/cc\360\237\226\211/TM\302\267ZeroLength.lib.c" rename "developer/cc\360\237\226\211/Map.lib.c" => "developer/deprecated\360\237\226\211/Map.lib.c" (100%) rename "developer/cc\360\237\226\211/Map2.lib.c" => "developer/deprecated\360\237\226\211/Map2.lib.c" (100%) rename "developer/cc\360\237\226\211/scatch.c" => "developer/deprecated\360\237\226\211/scatch.c" (100%) create mode 100644 "developer/document\360\237\226\211/Binding.org" create mode 100644 "developer/document\360\237\226\211/FG_tables.org" create mode 100644 "developer/document\360\237\226\211/TapeMachine_howto.org" create mode 100644 "developer/document\360\237\226\211/parameterized_functions.org" create mode 100644 "developer/document\360\237\226\211/source_file_sectioins.org" create mode 100644 "developer/document\360\237\226\211/template_in_C.org" create mode 100644 developer/example/try_TM_1-6.transcript create mode 100644 developer/example_cpp/example_A.transcript create mode 100644 developer/example_cpp/example_eval.transcript create mode 100644 developer/example_cpp/example_grow.transcript create mode 100644 developer/example_cpp/example_grow2.transcript create mode 100644 developer/example_cpp/example_recurse.transcript create mode 100644 developer/example_cpp/try_ext_0.transcript create mode 100644 developer/example_cpp/try_ext_1.transcript create mode 100644 developer/experiment/letter_all.c rename developer/experiment/{try_letters_2.c => letter_delta.c} (100%) create mode 100644 developer/experiment/letter_lm_rm_1.c create mode 100644 developer/experiment/letter_lm_rm_2.c create mode 100644 developer/experiment/letter_lm_rm_3.c create mode 100644 developer/experiment/letter_lm_rm_4.c create mode 100644 developer/experiment/letter_minus.c rename developer/experiment/{try_letters.c => letter_mu.c} (100%) rename developer/experiment/{try_letters_3.c => letter_theta.c} (100%) create mode 100644 developer/experiment/temp create mode 100644 "document\360\237\226\211/#temp.txt#" delete mode 100644 "document\360\237\226\211/Abstracting_Type_in_C.pdf" delete mode 100644 "document\360\237\226\211/Abstracting_Type_in_C.tex" create mode 100644 "document\360\237\226\211/temp.txt" diff --git "a/developer/cc\360\237\226\211/Binding.lib.c" "b/developer/cc\360\237\226\211/Binding.lib.c" deleted file mode 100644 index d36f1aa..0000000 --- "a/developer/cc\360\237\226\211/Binding.lib.c" +++ /dev/null @@ -1,98 +0,0 @@ -/* -Namespace: Binding -Template parameters: - - _BINDING_ - Type used to name the binding struct. Binding struct instances get passed as arguments to functions etc. - -This files declares a binding struct named [_BINDING_]. It also provides -the macro `call` that uses the binding. - -Note this file does not make an instance of the binding, and does not intialize -fields in an instance. - - - -*/ - -/*-------------------------------------------------------------------------------- - Interface --------------------------------------------------------------------------------*/ - - -// once per translation unit -#ifndef Binding·FACE -#define Binding·FACE - - #define Binding·DEBUG - #ifdef Binding·DEBUG - #include - #pragma message( "in #ifndef Binding_LIST section" ) - #endif - - #include "cpp_ext.c" - #include "Core.lib.c" - - /* - usage e.g.: Binding·call(tm, function_name, arg1, arg2, ...) - Expands to: (tm.fg->function_name)(tm ,arg1 ,arg2, ...) - - note the use of the comma operator to return the result from the b.fg->fn call - */ - #ifdef Binding·DEBUG - #include - #define Binding·call(b ,fn ,...) ( \ - assert((b).fg != NULL) \ - ,assert((b).tableau != NULL) \ - ,(b).fg->fn(b __VA_OPT__(,) __VA_ARGS__) \ - ) - #else - #define Binding·call(b ,fn ,...) \ - (b).fg->fn(b __VA_OPT__(,) __VA_ARGS__) - #endif - -#endif - - -// once per Binding value -#ifdef _BINDING_ -#if BOOLEAN(NOT_IN(Binding·SET ,_BINDING_)) -#ifdef Binding·DEBUG - #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) -#endif - - struct ·(_BINDING_ ,FG); - typedef struct ·(_BINDING_ ,FG) ·(_BINDING_ ,FG); - - struct ·(_BINDING_ ,Tableau); - typedef struct ·(_BINDING_ ,Tableau) ·(_BINDING_ ,Tableau); - - typedef struct _BINDING_{ - ·(_BINDING_ ,Tableau) *tableau; - ·(_BINDING_ ,FG) *fg; - } _BINDING_; - -#endif -#endif - - -/*-------------------------------------------------------------------------------- - Local - at bottom of translation unit, to keep some functions private - Binding currently has no local component ---------------------------------------------------------------------------------*/ -#ifdef LOCAL - -#endif - -/*-------------------------------------------------------------------------------- - Library - compiled into a lib.a file by the current make - Binding has no library component ---------------------------------------------------------------------------------*/ -#ifdef LIBRARY - -#endif - -/*-------------------------------------------------------------------------------- - undef the template parameters --------------------------------------------------------------------------------*/ -#undef _BINDING_ - diff --git "a/developer/cc\360\237\226\211/Core.lib.c" "b/developer/cc\360\237\226\211/Core.lib.c" index 9ac6fca..ec6a658 100644 --- "a/developer/cc\360\237\226\211/Core.lib.c" +++ "b/developer/cc\360\237\226\211/Core.lib.c" @@ -12,7 +12,7 @@ `AU` `Addressable Unit for the machine`. The C standard leaves this open to definition by the architecture and calls it `char`. On most all machines today it is uint8_t; - We use structs to group functions into a namespace. When all the functions that have a specific type of given argument are group together ,we call the table a 'Functions Given Type X table' ,or 'FG table' for short. A specific instance of an FG table is an `fg` table. + We use structs to group functions into a namespace. When all the functions that have a specific type of given argument are group together ,we call the table a 'Functions Given Type X table' ,or 'PFT table' for short. A specific instance of an PFT table is an `pft` table. */ @@ -23,7 +23,7 @@ #define Core·FACE #define Core·DEBUG - #ifdef FG·DEBUG + #ifdef PFT·DEBUG #include #endif @@ -99,19 +99,19 @@ ,bool condition ,char *message ); - } Core·Guard·FG; + } Core·Guard·PFT; // Default guard function table // initialized in the implementation section below - Local Core·Guard·FG Core·Guard·fg; + Local Core·Guard·PFT Core·Guard·pft; #define Core·Guard·init_count(chk) \ Core·Guard chk; \ - Core·Guard·fg.init(&chk ,__func__ ,Core·Flag·count); + Core·Guard·pft.init(&chk ,__func__ ,Core·Flag·count); #define Core·Guard·init_collect(chk) \ Core·Guard chk; \ - Core·Guard·fg.init(&chk ,__func__ ,Core·Flag·collect); + Core·Guard·pft.init(&chk ,__func__ ,Core·Flag·collect); #define Core·Guard·if_return(chk) if( chk.flag ) return Core·Status·derailed; #define Core·Guard·return(chk)\ @@ -172,7 +172,7 @@ chk->flag_function(&chk->flag ,err); } - Local Core·Guard·FG Core·Guard·fg = { + Local Core·Guard·PFT Core·Guard·pft = { .init = Core·Guard·init ,.reset = Core·Guard·reset ,.check = Core·Guard·check @@ -187,8 +187,8 @@ Local Core·Status Core·is_aligned(AU *p ,extent_t·AU alignment ,bool *flag){ #ifdef Core·DEBUG Core·Guard·init_count(chk); - Core·Guard·fg.check(&chk ,1 ,p ,"given NULL p"); - Core·Guard·fg.check(&chk ,1 ,flag ,"flag is NULL, so nowhere to write result"); + Core·Guard·pft.check(&chk ,1 ,p ,"given NULL p"); + Core·Guard·pft.check(&chk ,1 ,flag ,"flag is NULL, so nowhere to write result"); Core·Guard·if_return(chk); #endif *flag = ( (uintptr_t)p & alignment ) == 0; @@ -198,8 +198,8 @@ Local Core·Status Core·round_down(AU *p ,extent_t·AU alignment ,AU **result){ #ifdef Core·DEBUG Core·Guard·init_count(chk); - Core·Guard·fg.check(&chk ,1 ,p ,"given NULL p to round"); - Core·Guard·fg.check(&chk ,1 ,result ,"result is NULL, so nowhere to write result"); + Core·Guard·pft.check(&chk ,1 ,p ,"given NULL p to round"); + Core·Guard·pft.check(&chk ,1 ,result ,"result is NULL, so nowhere to write result"); Core·Guard·if_return(chk); #endif *result = (AU *)( (uintptr_t)p & ~(uintptr_t)alignment ); @@ -209,8 +209,8 @@ Local Core·Status Core·round_up(AU *p ,extent_t·AU alignment ,AU **result){ #ifdef Core·DEBUG Core·Guard·init_count(chk); - Core·Guard·fg.check(&chk ,1 ,p ,"given NULL p to round"); - Core·Guard·fg.check(&chk ,1 ,result ,"result is NULL, so nowhere to write result"); + Core·Guard·pft.check(&chk ,1 ,p ,"given NULL p to round"); + Core·Guard·pft.check(&chk ,1 ,result ,"result is NULL, so nowhere to write result"); Core·Guard·if_return(chk); #endif *result = (AU *)( ( (uintptr_t)p + alignment ) & ~(uintptr_t)alignment ); diff --git "a/developer/cc\360\237\226\211/ParameterConnector.lib.c" "b/developer/cc\360\237\226\211/ParameterConnector.lib.c" new file mode 100644 index 0000000..86f2591 --- /dev/null +++ "b/developer/cc\360\237\226\211/ParameterConnector.lib.c" @@ -0,0 +1,74 @@ +/* +Namespace: ParameterConnector + +Defines a macro for declaring parameter connectors, and for calling a parameterized function. + +Declares a parameter connector, does not initialize it. + +*/ + +/*-------------------------------------------------------------------------------- + Interface +-------------------------------------------------------------------------------*/ + + +// once per translation unit +#ifndef ParameterConnector·FACE +#define ParameterConnector·FACE + + #define ParameterConnector·DEBUG + #ifdef ParameterConnector·DEBUG + #include + #pragma message( "ParameterConnector·FACE" ) + #endif + + #include "cpp_ext.c" + #include "Core.lib.c" + + /* + usage e.g.: ParameterConnector·call(tm, function_name, arg1, arg2, ...) + Expands to: (tm.pft->function_name)(tm ,arg1 ,arg2, ...) + + note the use of the comma operator to return the result from the b.pft->fn call + */ + #ifdef ParameterConnector·DEBUG + #include + #define ParameterConnector·call(pc_instance ,fn ,...) ( \ + assert((pc_instance).pft != NULL) \ + ,assert((pc_instance).tableau != NULL) \ + ,(b).pft->fn(b __VA_OPT__(,) __VA_ARGS__) \ + ) + #else + #define ParameterConnector·call(pc_instance ,fn ,...) \ + (pc_instance).pft->fn(pc_instance __VA_OPT__(,) __VA_ARGS__) + #endif + + #define ParameterConnector·DECLARE(type) \ + typedef struct ·(type ,PFT) ·(type ,PFT); \ + typedef struct ·(type ,Tableau) ·(type ,Tableau); \ + typedef struct type { \ + ·(type ,Tableau) *tableau; \ + ·(type ,PFT) *pft; \ + } type; + +#endif + + + +/*-------------------------------------------------------------------------------- + Local - at bottom of translation unit, to keep some functions private + ParameterConnector currently has no local component +--------------------------------------------------------------------------------*/ +#ifdef LOCAL + +#endif + +/*-------------------------------------------------------------------------------- + Library - compiled into a lib.a file by the current make + ParameterConnector has no library component +--------------------------------------------------------------------------------*/ +#ifdef LIBRARY + +#endif + + diff --git "a/developer/cc\360\237\226\211/TM.lib.c" "b/developer/cc\360\237\226\211/TM.lib.c" index 6f5f1a9..ac59356 100644 --- "a/developer/cc\360\237\226\211/TM.lib.c" +++ "b/developer/cc\360\237\226\211/TM.lib.c" @@ -7,7 +7,7 @@ TM - Tape Machine Model Caller must declare TM set members: - #define SET__Binding__TM· // replacing with the actual value of CVT + #define SET_Binding__TM· // replacing with the actual value of CVT */ @@ -63,21 +63,18 @@ #endif //#ifndef TM·FACE // once per _TM·CVT_ value -// Caller must #define SET__Binding__TM·, after inclusion, to prevent re-inclusion +// Caller must #define SET_Binding__TM·, after inclusion, to prevent re-inclusion #ifdef _TM·CVT_ -#if BOOLEAN( NOT_IN(Binding ,·(TM,_TM·CVT_)) ) +#if BOOLEAN( NOT_IN(TM ,_TM·CVT_) ) #ifdef TM·DEBUG #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) #endif - #define _BINDING_ ·(TM,_TM·CVT_) - #include "Binding.lib.c" - - // debug: TM·AU tm_binding; - typedef size_t ·(extent_t,_TM·CVT_); - typedef struct ·(TM,_TM·CVT_,FG){ + ParameterConnector·DECLARE( ·(TM,_TM·CVT_) ) + + typedef struct ·(TM,_TM·CVT_,PFT){ TM·Topo (*topo) ( ·(TM,_TM·CVT_) tm ); bool (*bounded) ( ·(TM,_TM·CVT_) tm ); @@ -94,84 +91,17 @@ void (*dismount) ( ·(TM,_TM·CVT_) tm ); void (*step) ( ·(TM,_TM·CVT_) tm ); - void (*step_right) ( ·(TM,_TM·CVT_) tm ); void (*step_left) ( ·(TM,_TM·CVT_) tm ); void (*rewind) ( ·(TM,_TM·CVT_) tm ); _TM·CVT_ (*read) ( ·(TM,_TM·CVT_) tm ); void (*write) ( ·(TM,_TM·CVT_) tm ,_TM·CVT_ *remote_pt ); - } ·(TM,_TM·CVT_,FG); - - //---------------------------------------- - // ZeroLength tape interface - - typedef struct{ - bool hd; - } ·(TM,_TM·CVT_,ZeroLength,Tableau); - - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,ZeroLength,init)( - ·(TM,_TM·CVT_,ZeroLength,Tableau) *t - ); - - //---------------------------------------- - // SingletonSegment tape interface - - typedef struct{ - bool hd; - _TM·CVT_ value; - } ·(TM,_TM·CVT_,SingletonSegment,Tableau); - - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,SingletonSegment,init)( - ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t - ,_TM·CVT_ initial_value - ); - - //---------------------------------------- - // SingletonCircle tape interface - - typedef struct{ - bool hd; - _TM·CVT_ value; - } ·(TM,_TM·CVT_,SingletonCircle,Tableau); + } ·(TM,_TM·CVT_,PFT); - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,SingletonCircle,init)( - ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t - ,_TM·CVT_ initial_value - ); - //---------------------------------------- - // Array interface - - // Not exposing the implementation would be better, but the user needs to allocate these before calling init. - typedef struct{ - _TM·CVT_ *hd; - _TM·CVT_ *position; - ·(extent_t,_TM·CVT_) extent; - } ·(TM,_TM·CVT_,Array,Tableau); - - /* - We assume that the binding produced by init is valid. Thus: it does not have null pointers to the tableau or the fg table; it points to an initialized tableau; it points to a valid array fg table; and, that the fg table and tableau go together. - - Calling init is the only time the user/programmer will need to know the implementation name. - - The resulting binding object returned is what the user will call an instance of the - type. - */ - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,Array,init_pe)( - ·(TM,_TM·CVT_,Array,Tableau) *t - ,_TM·CVT_ position[] - ,·(extent_t,_TM·CVT_) extent - ); - - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,Array,init_pp)( - ·(TM,_TM·CVT_,Array,Tableau) *t - ,_TM·CVT_ *position_left - ,_TM·CVT_ *position_right - ); - -#endif // #if BOOLEAN( NOT_IN(Binding ,TM) ) -#endif // #ifdef _TM·CVT_ +#endif +#endif /*-------------------------------------------------------------------------------- Local @@ -193,481 +123,13 @@ #endif // once per _TM·CVT_ value - // Caller must #define SET__TM·LOCAL__TM·, after inclusion, to prevent re-inclusion + // Caller must #define SET_TM·LOCAL__TM·, after inclusion, to prevent re-inclusion #ifdef _TM·CVT_ #if BOOLEAN(NOT_IN(TM·LOCAL ,·(TM,_TM·CVT_))) #ifdef TM·DEBUG - #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + #pragma message( "Including TM LOCAL code for:" STR_VAL(_TM·CVT_) ) #endif - /*------------------------------------------------------------------------ - ZeroLength tape implementation - */ - - Local TM·Topo ·(TM,_TM·CVT_,ZeroLength,topo)( ·(TM,_TM·CVT_) tm ){ - return TM·Topo·zero_length; - } - - Local bool ·(TM,_TM·CVT_,ZeroLength,bounded)( ·(TM,_TM·CVT_) tm ){ - return true; - } - - Local ·(extent_t,_TM·CVT_) ·(TM,_TM·CVT_,ZeroLength,extent)( ·(TM,_TM·CVT_) tm ){ - assert(0); - } - - Local TM·Status ·(TM,_TM·CVT_,ZeroLength,status)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; - if( !t->hd ) return TM·Status·dismounted; - return TM·Status·out_of_area; - } - - Local bool ·(TM,_TM·CVT_,ZeroLength,dismounted)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; - return !t->hd; - } - - Local bool ·(TM,_TM·CVT_,ZeroLength,on_tape)( ·(TM,_TM·CVT_) tm ){ - return false; - } - - Local bool ·(TM,_TM·CVT_,ZeroLength,on_leftmost)( ·(TM,_TM·CVT_) tm ){ - return false; - } - - Local bool ·(TM,_TM·CVT_,ZeroLength,on_rightmost)( ·(TM,_TM·CVT_) tm ){ - return false; - } - - // does nothing if tape is already mounted - Local void ·(TM,_TM·CVT_,ZeroLength,mount)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; - if( !t->hd ) t->hd = true; - } - - Local void ·(TM,_TM·CVT_,ZeroLength,dismount)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; - t->hd = false; - } - - Local void ·(TM,_TM·CVT_,ZeroLength,step)( ·(TM,_TM·CVT_) tm ){ - assert(0); - } - - Local void ·(TM,_TM·CVT_,ZeroLength,step_left)( ·(TM,_TM·CVT_) tm ){ - assert(0); - } - - // rewind does nothing if the tape is dismounted - Local void ·(TM,_TM·CVT_,ZeroLength,rewind)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; - if( ·(TM,_TM·CVT_,ZeroLength,dismounted)( tm ) ) return; - assert(0); - } - - Local _TM·CVT_ ·(TM,_TM·CVT_,ZeroLength,read)( ·(TM,_TM·CVT_) tm ){ - assert(0); - } - - Local void ·(TM,_TM·CVT_,ZeroLength,write)( ·(TM,_TM·CVT_) tm ,_TM·CVT_ *remote_pt ){ - assert(0); - } - - Local ·(TM,_TM·CVT_,FG) ·(TM,_TM·CVT_,ZeroLength,fg) = { - - .topo = ·(TM,_TM·CVT_,ZeroLength,topo) - ,.bounded = ·(TM,_TM·CVT_,ZeroLength,bounded) - ,.extent = ·(TM,_TM·CVT_,ZeroLength,extent) - - ,.status = ·(TM,_TM·CVT_,ZeroLength,status) - ,.dismounted = ·(TM,_TM·CVT_,ZeroLength,dismounted) - ,.on_tape = ·(TM,_TM·CVT_,ZeroLength,on_tape) - ,.on_leftmost = ·(TM,_TM·CVT_,ZeroLength,on_leftmost) - ,.on_rightmost = ·(TM,_TM·CVT_,ZeroLength,on_rightmost) - - ,.mount = ·(TM,_TM·CVT_,ZeroLength,mount) - ,.dismount = ·(TM,_TM·CVT_,ZeroLength,dismount) - - ,.step = ·(TM,_TM·CVT_,ZeroLength,step) - ,.step_right = ·(TM,_TM·CVT_,ZeroLength,step) - ,.step_left = ·(TM,_TM·CVT_,ZeroLength,step_left) - ,.rewind = ·(TM,_TM·CVT_,ZeroLength,rewind) - - ,.read = ·(TM,_TM·CVT_,ZeroLength,read) - ,.write = ·(TM,_TM·CVT_,ZeroLength,write) - - }; - - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,ZeroLength,init)( - ·(TM,_TM·CVT_,ZeroLength,Tableau) *t - ){ - t->hd = true; - ·(TM,_TM·CVT_) tm = { - .tableau = (·(TM,_TM·CVT_,Tableau) *)t - ,.fg = &·(TM,_TM·CVT_,ZeroLength,fg) - }; - return tm; - } - - /*------------------------------------------------------------------------ - SingletonSegment tape - */ - - Local TM·Topo ·(TM,_TM·CVT_,SingletonSegment,topo)( ·(TM,_TM·CVT_) tm ){ - return TM·Topo·singleton; - } - Local bool ·(TM,_TM·CVT_,SingletonSegment,bounded)( ·(TM,_TM·CVT_) tm ){ - return true; - } - Local ·(extent_t,_TM·CVT_) ·(TM,_TM·CVT_,SingletonSegment,extent)( ·(TM,_TM·CVT_) tm ){ - return 0; - } - Local TM·Status ·(TM,_TM·CVT_,SingletonSegment,status)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; - if( !t->hd ) return TM·Status·dismounted; - return TM·Status·leftmost | TM·Status·rightmost; - } - Local bool ·(TM,_TM·CVT_,SingletonSegment,dismounted)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; - return !t->hd; - } - - // these could be pulled from the tm.fg table, and defined once - Local bool ·(TM,_TM·CVT_,SingletonSegment,on_tape)( ·(TM,_TM·CVT_) tm ){ - return ·(TM,_TM·CVT_,SingletonSegment,status)( tm ) & TM·Status·on_tape; - } - Local bool ·(TM,_TM·CVT_,SingletonSegment,on_leftmost)( ·(TM,_TM·CVT_) tm ){ - return ·(TM,_TM·CVT_,SingletonSegment,status)( tm ) & TM·Status·leftmost; - } - Local bool ·(TM,_TM·CVT_,SingletonSegment,on_rightmost)( ·(TM,_TM·CVT_) tm ){ - return ·(TM,_TM·CVT_,SingletonSegment,status)( tm ) & TM·Status·rightmost; - } - - // does nothing if tape is already mounted - Local void ·(TM,_TM·CVT_,SingletonSegment,mount)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; - t->hd = true; - } - Local void ·(TM,_TM·CVT_,SingletonSegment,dismount)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; - t->hd = false; - } - - Local void ·(TM,_TM·CVT_,SingletonSegment,step)( ·(TM,_TM·CVT_) tm ){ - assert(0); - } - Local void ·(TM,_TM·CVT_,SingletonSegment,step_left)( ·(TM,_TM·CVT_) tm ){ - assert(0); - } - Local void ·(TM,_TM·CVT_,SingletonSegment,rewind)( ·(TM,_TM·CVT_) tm ){ - return; - } - - Local _TM·CVT_ ·(TM,_TM·CVT_,SingletonSegment,read)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; - return t->value; - } - Local void ·(TM,_TM·CVT_,SingletonSegment,write)( ·(TM,_TM·CVT_) tm ,_TM·CVT_ *remote_pt ){ - ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; - t->value = *remote_pt; - } - - Local ·(TM,_TM·CVT_,FG) ·(TM,_TM·CVT_,SingletonSegment,fg) = { - - .topo = ·(TM,_TM·CVT_,SingletonSegment,topo) - ,.bounded = ·(TM,_TM·CVT_,SingletonSegment,bounded) - ,.extent = ·(TM,_TM·CVT_,SingletonSegment,extent) - - ,.status = ·(TM,_TM·CVT_,SingletonSegment,status) - ,.dismounted = ·(TM,_TM·CVT_,SingletonSegment,dismounted) - ,.on_tape = ·(TM,_TM·CVT_,SingletonSegment,on_tape) - ,.on_leftmost = ·(TM,_TM·CVT_,SingletonSegment,on_leftmost) - ,.on_rightmost = ·(TM,_TM·CVT_,SingletonSegment,on_rightmost) - - ,.mount = ·(TM,_TM·CVT_,SingletonSegment,mount) - ,.dismount = ·(TM,_TM·CVT_,SingletonSegment,dismount) - - ,.step = ·(TM,_TM·CVT_,SingletonSegment,step) - ,.step_right = ·(TM,_TM·CVT_,SingletonSegment,step) - ,.step_left = ·(TM,_TM·CVT_,SingletonSegment,step_left) - ,.rewind = ·(TM,_TM·CVT_,SingletonSegment,rewind) - - ,.read = ·(TM,_TM·CVT_,SingletonSegment,read) - ,.write = ·(TM,_TM·CVT_,SingletonSegment,write) - - }; - - /* - tm is up casted from being array specific, to being generic. Later it is downcasted within the array code before being used. This can be seen at the top of each of the array specific function. This is the only loss of static type safety, and it is embedded in the library code. - */ - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,SingletonSegment,init)( - ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t - ,_TM·CVT_ initial_value - ){ - t->hd = true; - t->value = initial_value; - - ·(TM,_TM·CVT_) tm = { - .tableau = (·(TM,_TM·CVT_,Tableau) *)t - ,.fg = &·(TM,_TM·CVT_,SingletonSegment,fg) - }; - - return tm; - } - - - /*------------------------------------------------------------------------ - SingletonCircle tape - */ - - Local TM·Topo ·(TM,_TM·CVT_,SingletonCircle,topo)( ·(TM,_TM·CVT_) tm ){ - return TM·Topo·circle; - } - Local bool ·(TM,_TM·CVT_,SingletonCircle,bounded)( ·(TM,_TM·CVT_) tm ){ - return false; - } - Local ·(extent_t,_TM·CVT_) ·(TM,_TM·CVT_,SingletonCircle,extent)( ·(TM,_TM·CVT_) tm ){ - return 0; - } - Local TM·Status ·(TM,_TM·CVT_,SingletonCircle,status)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; - if( !t->hd ) return TM·Status·dismounted; - return TM·Status·interim; - } - Local bool ·(TM,_TM·CVT_,SingletonCircle,dismounted)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; - return !t->hd; - } - - // these could be pulled from the tm.fg table, and defined once - Local bool ·(TM,_TM·CVT_,SingletonCircle,on_tape)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; - return t->hd; - } - Local bool ·(TM,_TM·CVT_,SingletonCircle,on_leftmost)( ·(TM,_TM·CVT_) tm ){ - return false; - } - Local bool ·(TM,_TM·CVT_,SingletonCircle,on_rightmost)( ·(TM,_TM·CVT_) tm ){ - return false; - } - - // does nothing if tape is already mounted - Local void ·(TM,_TM·CVT_,SingletonCircle,mount)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; - t->hd = true; - } - Local void ·(TM,_TM·CVT_,SingletonCircle,dismount)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; - t->hd = false; - } - - Local void ·(TM,_TM·CVT_,SingletonCircle,step)( ·(TM,_TM·CVT_) tm ){ - return; - } - Local void ·(TM,_TM·CVT_,SingletonCircle,step_left)( ·(TM,_TM·CVT_) tm ){ - return; - } - Local void ·(TM,_TM·CVT_,SingletonCircle,rewind)( ·(TM,_TM·CVT_) tm ){ - return; - } - - Local _TM·CVT_ ·(TM,_TM·CVT_,SingletonCircle,read)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; - return t->value; - } - Local void ·(TM,_TM·CVT_,SingletonCircle,write)( ·(TM,_TM·CVT_) tm ,_TM·CVT_ *remote_pt ){ - ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; - t->value = *remote_pt; - } - - Local ·(TM,_TM·CVT_,FG) ·(TM,_TM·CVT_,SingletonCircle,fg) = { - - .topo = ·(TM,_TM·CVT_,SingletonCircle,topo) - ,.bounded = ·(TM,_TM·CVT_,SingletonCircle,bounded) - ,.extent = ·(TM,_TM·CVT_,SingletonCircle,extent) - - ,.status = ·(TM,_TM·CVT_,SingletonCircle,status) - ,.dismounted = ·(TM,_TM·CVT_,SingletonCircle,dismounted) - ,.on_tape = ·(TM,_TM·CVT_,SingletonCircle,on_tape) - ,.on_leftmost = ·(TM,_TM·CVT_,SingletonCircle,on_leftmost) - ,.on_rightmost = ·(TM,_TM·CVT_,SingletonCircle,on_rightmost) - - ,.mount = ·(TM,_TM·CVT_,SingletonCircle,mount) - ,.dismount = ·(TM,_TM·CVT_,SingletonCircle,dismount) - - ,.step = ·(TM,_TM·CVT_,SingletonCircle,step) - ,.step_right = ·(TM,_TM·CVT_,SingletonCircle,step) - ,.step_left = ·(TM,_TM·CVT_,SingletonCircle,step_left) - ,.rewind = ·(TM,_TM·CVT_,SingletonCircle,rewind) - - ,.read = ·(TM,_TM·CVT_,SingletonCircle,read) - ,.write = ·(TM,_TM·CVT_,SingletonCircle,write) - - }; - - /* - tm is up casted from being array specific, to being generic. Later it is downcasted within the array code before being used. This can be seen at the top of each of the array specific function. This is the only loss of static type safety, and it is embedded in the library code. - */ - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,SingletonCircle,init)( - ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t - ,_TM·CVT_ initial_value - ){ - t->hd = true; - t->value = initial_value; - - ·(TM,_TM·CVT_) tm = { - .tableau = (·(TM,_TM·CVT_,Tableau) *)t - ,.fg = &·(TM,_TM·CVT_,SingletonCircle,fg) - }; - - return tm; - } - - - /*------------------------------------------------------------------------ - Array implementation with a segment tape - */ - - Local TM·Topo ·(TM,_TM·CVT_,Array,topo)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - if( t->extent == 0 ) return TM·Topo·singleton; - return TM·Topo·segment; - } - - Local bool ·(TM,_TM·CVT_,Array,bounded)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - return ·(TM,_TM·CVT_,Array,topo)( tm ) & TM·Topo·bounded; - } - - Local ·(extent_t,_TM·CVT_) ·(TM,_TM·CVT_,Array,extent)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - return t->extent; - } - - - Local TM·Status ·(TM,_TM·CVT_,Array,status)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - if( !t->hd ) return TM·Status·dismounted; - if( t->hd == t->position ) return TM·Status·leftmost; - - _TM·CVT_ *rightmost_pt = t->position + t->extent; - if( t->hd == rightmost_pt ) return TM·Status·rightmost; - if( t->hd < t->position || t->hd > rightmost_pt ) - return TM·Status·out_of_area; - - return TM·Status·interim; - } - - Local bool ·(TM,_TM·CVT_,Array,dismounted)( ·(TM,_TM·CVT_) tm ){ - return ·(TM,_TM·CVT_,Array,status)( tm ) & TM·Status·dismounted; - } - - Local bool ·(TM,_TM·CVT_,Array,on_tape)( ·(TM,_TM·CVT_) tm ){ - return ·(TM,_TM·CVT_,Array,status)( tm ) & TM·Status·on_tape; - } - - Local bool ·(TM,_TM·CVT_,Array,on_leftmost)( ·(TM,_TM·CVT_) tm ){ - return ·(TM,_TM·CVT_,Array,status)( tm ) & TM·Status·leftmost; - } - - Local bool ·(TM,_TM·CVT_,Array,on_rightmost)( ·(TM,_TM·CVT_) tm ){ - return ·(TM,_TM·CVT_,Array,status)( tm ) & TM·Status·rightmost; - } - - // does nothing if tape is already mounted - Local void ·(TM,_TM·CVT_,Array,mount)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - if( !t->hd ) t->hd = t->position; - } - - Local void ·(TM,_TM·CVT_,Array,dismount)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - t->hd = NULL; - } - - Local void ·(TM,_TM·CVT_,Array,step)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - t->hd++; - } - - Local void ·(TM,_TM·CVT_,Array,step_left)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - t->hd--; - } - - // rewind does nothing if the tape is dismounted - Local void ·(TM,_TM·CVT_,Array,rewind)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - if( ·(TM,_TM·CVT_,Array,dismounted)( tm ) ) return; - t->hd = t->position; - } - - Local _TM·CVT_ ·(TM,_TM·CVT_,Array,read)( ·(TM,_TM·CVT_) tm ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - return *t->hd; - } - - Local void ·(TM,_TM·CVT_,Array,write)( ·(TM,_TM·CVT_) tm ,_TM·CVT_ *remote_pt ){ - ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; - *t->hd = *remote_pt; - } - - Local ·(TM,_TM·CVT_,FG) ·(TM,_TM·CVT_,Array,fg) = { - - .topo = ·(TM,_TM·CVT_,Array,topo) - ,.bounded = ·(TM,_TM·CVT_,Array,bounded) - ,.extent = ·(TM,_TM·CVT_,Array,extent) - - ,.status = ·(TM,_TM·CVT_,Array,status) - ,.dismounted = ·(TM,_TM·CVT_,Array,dismounted) - ,.on_tape = ·(TM,_TM·CVT_,Array,on_tape) - ,.on_leftmost = ·(TM,_TM·CVT_,Array,on_leftmost) - ,.on_rightmost = ·(TM,_TM·CVT_,Array,on_rightmost) - - ,.mount = ·(TM,_TM·CVT_,Array,mount) - ,.dismount = ·(TM,_TM·CVT_,Array,dismount) - - ,.step = ·(TM,_TM·CVT_,Array,step) - ,.step_right = ·(TM,_TM·CVT_,Array,step) - ,.step_left = ·(TM,_TM·CVT_,Array,step_left) - ,.rewind = ·(TM,_TM·CVT_,Array,rewind) - - ,.read = ·(TM,_TM·CVT_,Array,read) - ,.write = ·(TM,_TM·CVT_,Array,write) - - }; - - /* - tm is up casted from being array specific, to being generic. Later it is downcasted within the array code before being used. This can be seen at the top of each of the array specific function. This is the only loss of static type safety, and it is embedded in the library code. - */ - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,Array,init_pe)( - ·(TM,_TM·CVT_,Array,Tableau) *t - ,_TM·CVT_ *position - ,·(extent_t,_TM·CVT_) extent - ){ - t->hd = position; - t->position = position; - t->extent = extent; - - ·(TM,_TM·CVT_) tm = { - .tableau = (·(TM,_TM·CVT_,Tableau) *)t - ,.fg = &·(TM,_TM·CVT_,Array,fg) - }; - - return tm; - } - - ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,Array,init_pp)( - ·(TM,_TM·CVT_,Array,Tableau) *t - ,_TM·CVT_ *position_left - ,_TM·CVT_ *position_right - ){ - return ·(TM,_TM·CVT_,Array,init_pe)( - t ,position_left ,position_right - position_left - ); - } - - #endif // #if BOOLEAN(NOT_IN(TM·LOCAL ,TM)) #endif // #ifdef _TM·CVT_ @@ -679,8 +141,3 @@ --------------------------------------------------------------------------------*/ #ifdef LIBRARY #endif - -//-------------------------------------------------------------------------------- -// undef the template parameters -//-------------------------------------------------------------------------------- -#undef _TM·CVT_ diff --git "a/developer/cc\360\237\226\211/TM\302\267Array.lib.c" "b/developer/cc\360\237\226\211/TM\302\267Array.lib.c" new file mode 100644 index 0000000..a8fd814 --- /dev/null +++ "b/developer/cc\360\237\226\211/TM\302\267Array.lib.c" @@ -0,0 +1,243 @@ +/* + Namespace: TM·Array + + Template parameters: + + `_TM·CVT_` Cell Value Type`. + +*/ +#include "TM.lib.c" + +/*-------------------------------------------------------------------------------- + Interface +--------------------------------------------------------------------------------*/ + +// once per translation unit +#ifndef TM·Array·FACE +#define TM·Array·FACE + + #define TM·Array·DEBUG + #ifdef TM·Array·DEBUG + #include + #endif + +#endif + +// once per _TM·CVT_ value +// Caller must #define SET_TM·Array·, after inclusion, to prevent re-inclusion +#ifdef _TM·CVT_ +#if BOOLEAN( NOT_IN(TM·Array ,_TM·CVT_) ) + + #include "TM.Lib.c" + + #pragma push(T) + #pragma push(TA) + #pragma push(TE) + + #define T ·(TM,_TM·CVT_) + #define TA ·(TM,Array,_TM·CVT_) + #define TE ·(extent_t,_TM·CVT_) + + #ifdef TM·Array·DEBUG + #pragma message( "Declaring:" STR_VAL(TA) ) + #endif + + typedef struct{ + _TM·CVT_ *hd; + _TM·CVT_ *position; + TE extent; + } ·(TA,Tableau); + + // call signatures for the initialization functions + // + T ·(TA,init_pe)( + ·(TA,Tableau) *t ,_TM·CVT_ position[] ,TE extent + ); + + T ·(TA,init_pp)( + ·(TA,Tableau) *t ,_TM·CVT_ *position_left ,_TM·CVT_ *position_right + ); + + #pragma pop(T) + #pragma pop(TA) + #pragma pop(TE) + +#endif +#endif + +/*-------------------------------------------------------------------------------- + Local +--------------------------------------------------------------------------------*/ +#ifdef LOCAL + + // once per translation unit + #ifndef TM·Array·LOCAL + #define TM·Array·LOCAL + + #endif + + // once per _TM·CVT_ value + #ifdef _TM·CVT_ + #if BOOLEAN( NOT_IN(TM·Array·LOCAL ,_TM·CVT_) ) + + #include "TM.Lib.c" + + #pragma push(T) + #pragma push(TA) + #pragma push(TE) + + #define T ·(TM,_TM·CVT_) + #define TA ·(TM,Array,_TM·CVT_) + #define TE ·(extent_t,_TM·CVT_) + + #ifdef TM·Array·DEBUG + #pragma message( "LOCAL:" STR_VAL(TA) ) + #endif + + Local TM·Topo ·(TA,topo)(T tm){ + ·(TM,_TM·CVT_,Array,Tableau) *t = (·(TM,_TM·CVT_,Array,Tableau) *) tm.tableau; + if( t->extent == 0 ) return TM·Topo·singleton; + return TM·Topo·segment; + } + Local bool ·(TA,bounded)(T tm){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + return ·(TA,topo)(tm) & TM·Topo·bounded; + } + Local TE ·(TA,extent)(T tm){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + return t->extent; + } + + Local TM·Status ·(TA,status)(T tm){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + if( !t->hd ) return TM·Status·dismounted; + if( t->hd == t->position ) return TM·Status·leftmost; + + _TM·CVT_ *rightmost_pt = t->position + t->extent; + if( t->hd == rightmost_pt ) return TM·Status·rightmost; + if( t->hd < t->position || t->hd > rightmost_pt ) + return TM·Status·out_of_area; + + return TM·Status·interim; + } + + Local bool ·(TA,dismounted)(T tm){ + return ·(TA,status)( tm ) & TM·Status·dismounted; + } + + Local bool ·(TA,on_tape)(T tm){ + return ·(TA,status)( tm ) & TM·Status·on_tape; + } + + Local bool ·(TA,on_leftmost)(T tm){ + return ·(TA,status)( tm ) & TM·Status·leftmost; + } + + Local bool ·(TA,on_rightmost)(T tm){ + return ·(TA,status)( tm ) & TM·Status·rightmost; + } + + // does nothing if tape is already mounted + Local void ·(TA,mount)(T tm){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + if( !t->hd ) t->hd = t->position; + } + + Local void ·(TA,dismount)(T tm){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + t->hd = NULL; + } + + Local void ·(TA,step)(T tm){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + t->hd++; + } + + Local void ·(TA,step_left)(T tm){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + t->hd--; + } + + // rewind does nothing if the tape is dismounted + Local void ·(TA,rewind)(T tm){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + if( ·(TA,dismounted)( tm ) ) return; + t->hd = t->position; + } + + Local _TM·CVT_ ·(TA,read)(T tm){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + return *t->hd; + } + + Local void ·(TA,write)(T tm ,_TM·CVT_ *remote_pt){ + ·(TA,Tableau) *t = (·(TA,Tableau) *) tm.tableau; + *t->hd = *remote_pt; + } + + Local ·(TM,_TM·CVT_,PFT) ·(TA,pft) = { + + .topo = ·(TA,topo) + ,.bounded = ·(TA,bounded) + ,.extent = ·(TA,extent) + + ,.status = ·(TA,status) + ,.dismounted = ·(TA,dismounted) + ,.on_tape = ·(TA,on_tape) + ,.on_leftmost = ·(TA,on_leftmost) + ,.on_rightmost = ·(TA,on_rightmost) + + ,.mount = ·(TA,mount) + ,.dismount = ·(TA,dismount) + + ,.step = ·(TA,step) + ,.step_left = ·(TA,step_left) + ,.rewind = ·(TA,rewind) + + ,.read = ·(TA,read) + ,.write = ·(TA,write) + + }; + + /* + tm is up casted from being array specific, to being generic. Later it is downcasted within the array code before being used. This can be seen at the top of each of the array specific function. This is the only loss of static type safety, and it is embedded in the library code. + */ + ·(TM,_TM·CVT_) ·(TA,init_pe)( + ·(TA,Tableau) *t + ,_TM·CVT_ *position + ,TE extent + ){ + t->hd = position; + t->position = position; + t->extent = extent; + + T tm = { + .tableau = (·(TM,_TM·CVT_,Tableau) *)t + ,.pft = &·(TA,pft) + }; + + return tm; + } + + ·(TM,_TM·CVT_) ·(TA,init_pp)( + ·(TA,Tableau) *t + ,_TM·CVT_ *position_left + ,_TM·CVT_ *position_right + ){ + return ·(TA,init_pe)( + t ,position_left ,position_right - position_left + ); + } + + + #endif // #if BOOLEAN(NOT_IN(TM·LOCAL ,TM)) + #endif // #ifdef _TM·CVT_ + +#endif // LOCAL + +/*-------------------------------------------------------------------------------- + Library - compiled into a lib.a file by the current make + Core currently has no library components +--------------------------------------------------------------------------------*/ +#ifdef LIBRARY +#endif diff --git "a/developer/cc\360\237\226\211/TM\302\267SingletonCircle.lib.c" "b/developer/cc\360\237\226\211/TM\302\267SingletonCircle.lib.c" new file mode 100644 index 0000000..ee7abe7 --- /dev/null +++ "b/developer/cc\360\237\226\211/TM\302\267SingletonCircle.lib.c" @@ -0,0 +1,182 @@ +/* + Namespace: TM + Template parameters: + + `_TM·CVT_` Cell Value Type`. + + TM - Tape Machine Model + + Caller must declare TM set members: + #define SET_Binding__TM· // replacing with the actual value of CVT + +*/ + +/*-------------------------------------------------------------------------------- + Interface +--------------------------------------------------------------------------------*/ + +// once per translation unit +#ifndef TM·FACE +#define TM·FACE + + #define TM·SingletonCircle·DEBUG + #ifdef TM·SingletonCircle·DEBUG + #include + #endif + +#endif //#ifndef TM·FACE + +// once per _TM·CVT_ value +// Caller must #define SET_Binding__TM·SingletonCircle·, after inclusion, to prevent re-inclusion +#ifdef _TM·CVT_ +#if BOOLEAN( NOT_IN(Binding ,·(TM·SingletonCircle,_TM·CVT_)) ) +#ifdef TM·DEBUG + #pragma message( "Creating TM·SingletonCircle type with a CVT of:" STR_VAL(_TM·CVT_) ) +#endif + + typedef struct{ + bool hd; + _TM·CVT_ value; + } ·(TM,_TM·CVT_,SingletonCircle,Tableau); + + ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,SingletonCircle,init)( + ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t + ,_TM·CVT_ initial_value + ); + +#endif // #if BOOLEAN( NOT_IN(Binding ,TM) ) +#endif // #ifdef _TM·CVT_ + +/*-------------------------------------------------------------------------------- + Local +--------------------------------------------------------------------------------*/ +#ifdef LOCAL + + // once per translation unit + #ifndef TM·SingletonCircle·LOCAL + #define TM·SingletonCircle·LOCAL + + #endif + + // once per _TM·CVT_ value + // Caller must #define SET_TM·LOCAL__TM·, after inclusion, to prevent re-inclusion + #ifdef _TM·CVT_ + #if BOOLEAN(NOT_IN(TM·SingletonCircle·LOCAL ,·(TM,_TM·CVT_))) + #ifdef TM·SingletonCircle·DEBUG + #pragma message( "Including TM·SingletonCircle LOCAL code for:" STR_VAL(_TM·CVT_) ) + #endif + + Local TM·Topo ·(TM,_TM·CVT_,SingletonCircle,topo)( ·(TM,_TM·CVT_) tm ){ + return TM·Topo·circle; + } + Local bool ·(TM,_TM·CVT_,SingletonCircle,bounded)( ·(TM,_TM·CVT_) tm ){ + return false; + } + Local ·(extent_t,_TM·CVT_) ·(TM,_TM·CVT_,SingletonCircle,extent)( ·(TM,_TM·CVT_) tm ){ + return 0; + } + Local TM·Status ·(TM,_TM·CVT_,SingletonCircle,status)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; + if( !t->hd ) return TM·Status·dismounted; + return TM·Status·interim; + } + Local bool ·(TM,_TM·CVT_,SingletonCircle,dismounted)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; + return !t->hd; + } + + // these could be pulled from the tm.pft table, and defined once + Local bool ·(TM,_TM·CVT_,SingletonCircle,on_tape)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; + return t->hd; + } + Local bool ·(TM,_TM·CVT_,SingletonCircle,on_leftmost)( ·(TM,_TM·CVT_) tm ){ + return false; + } + Local bool ·(TM,_TM·CVT_,SingletonCircle,on_rightmost)( ·(TM,_TM·CVT_) tm ){ + return false; + } + + // does nothing if tape is already mounted + Local void ·(TM,_TM·CVT_,SingletonCircle,mount)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; + t->hd = true; + } + Local void ·(TM,_TM·CVT_,SingletonCircle,dismount)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; + t->hd = false; + } + + Local void ·(TM,_TM·CVT_,SingletonCircle,s)( ·(TM,_TM·CVT_) tm ){ + return; + } + Local void ·(TM,_TM·CVT_,SingletonCircle,step_left)( ·(TM,_TM·CVT_) tm ){ + return; + } + Local void ·(TM,_TM·CVT_,SingletonCircle,rewind)( ·(TM,_TM·CVT_) tm ){ + return; + } + + Local _TM·CVT_ ·(TM,_TM·CVT_,SingletonCircle,r)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; + return t->value; + } + Local void ·(TM,_TM·CVT_,SingletonCircle,w)( ·(TM,_TM·CVT_) tm ,_TM·CVT_ *remote_pt ){ + ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t = (·(TM,_TM·CVT_,SingletonCircle,Tableau) *) tm.tableau; + t->value = *remote_pt; + } + + Local ·(TM,_TM·CVT_,PFT) ·(TM,_TM·CVT_,SingletonCircle,pft) = { + + .topo = ·(TM,_TM·CVT_,SingletonCircle,topo) + ,.bounded = ·(TM,_TM·CVT_,SingletonCircle,bounded) + ,.extent = ·(TM,_TM·CVT_,SingletonCircle,extent) + + ,.status = ·(TM,_TM·CVT_,SingletonCircle,status) + ,.dismounted = ·(TM,_TM·CVT_,SingletonCircle,dismounted) + ,.on_tape = ·(TM,_TM·CVT_,SingletonCircle,on_tape) + ,.on_leftmost = ·(TM,_TM·CVT_,SingletonCircle,on_leftmost) + ,.on_rightmost = ·(TM,_TM·CVT_,SingletonCircle,on_rightmost) + + ,.mount = ·(TM,_TM·CVT_,SingletonCircle,mount) + ,.dismount = ·(TM,_TM·CVT_,SingletonCircle,dismount) + + ,.step = ·(TM,_TM·CVT_,SingletonCircle,s) + ,.step_left = ·(TM,_TM·CVT_,SingletonCircle,step_left) + ,.rewind = ·(TM,_TM·CVT_,SingletonCircle,rewind) + + ,.r = ·(TM,_TM·CVT_,SingletonCircle,r) + ,.w = ·(TM,_TM·CVT_,SingletonCircle,w) + + }; + + /* + tm is up casted from being array specific, to being generic. Later it is downcasted within the array code before being used. This can be seen at the top of each of the array specific function. This is the only loss of static type safety, and it is embedded in the library code. + */ + ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,SingletonCircle,init)( + ·(TM,_TM·CVT_,SingletonCircle,Tableau) *t + ,_TM·CVT_ initial_value + ){ + t->hd = true; + t->value = initial_value; + + ·(TM,_TM·CVT_) tm = { + .tableau = (·(TM,_TM·CVT_,Tableau) *)t + ,.pft = &·(TM,_TM·CVT_,SingletonCircle,pft) + }; + + return tm; + } + + #endif // #if BOOLEAN(NOT_IN(TM·LOCAL ,TM)) + #endif // #ifdef _TM·CVT_ + +#endif // LOCAL + +/*-------------------------------------------------------------------------------- + Library - compiled into a lib.a file by the current make + Core currently has no library components +--------------------------------------------------------------------------------*/ +#ifdef LIBRARY +#endif + diff --git "a/developer/cc\360\237\226\211/TM\302\267SingletonSegment.lib.c" "b/developer/cc\360\237\226\211/TM\302\267SingletonSegment.lib.c" new file mode 100644 index 0000000..90d55f7 --- /dev/null +++ "b/developer/cc\360\237\226\211/TM\302\267SingletonSegment.lib.c" @@ -0,0 +1,178 @@ +/* + Namespace: TM·SingletonSegment + + Template parameters: + + `_TM·CVT_` Cell Value Type`. + +*/ +#include "TM.lib.c" + +/*-------------------------------------------------------------------------------- + Interface +--------------------------------------------------------------------------------*/ + +// once per translation unit +#ifndef TM·FACE +#define TM·FACE + + #define TM·SingletonSegment·DEBUG + #ifdef TM·SingletonSegment·DEBUG + #include + #endif + +#endif //#ifndef TM·FACE + +// once per _TM·CVT_ value +// Caller must #define SET_Binding__TM·SingletonSegment·, after inclusion, to prevent re-inclusion +#ifdef _TM·CVT_ +#if BOOLEAN( NOT_IN(Binding ,·(TM·SingletonSegment,_TM·CVT_)) ) +#ifdef TM·SingletonSegment·DEBUG + #pragma message( "Creating TM·SingletonSegment type with a CVT of:" STR_VAL(_TM·CVT_) ) +#endif + + typedef struct{ + bool hd; + _TM·CVT_ value; + } ·(TM,_TM·CVT_,SingletonSegment,Tableau); + + ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,SingletonSegment,init)( + ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t + ,_TM·CVT_ initial_value + ); + +#endif +#endif + +/*-------------------------------------------------------------------------------- + Local +--------------------------------------------------------------------------------*/ +#ifdef LOCAL + + // once per translation unit + #ifndef TM·SingletonSegment·LOCAL + #define TM·SingletonSegment·LOCAL + + #endif + + // once per _TM·CVT_ value + // Caller must #define SET_TM·LOCAL__TM·, after inclusion, to prevent re-inclusion + #ifdef _TM·CVT_ + #if BOOLEAN(NOT_IN(TM·LOCAL ,·(TM·SingletonSegment,_TM·CVT_))) + #ifdef TM·SingletonSegment·DEBUG + #pragma message( "Including TM·SingletonSegment LOCAL code for:" STR_VAL(_TM·CVT_) ) + #endif + + Local TM·Topo ·(TM,_TM·CVT_,SingletonSegment,topo)( ·(TM,_TM·CVT_) tm ){ + return TM·Topo·singleton; + } + Local bool ·(TM,_TM·CVT_,SingletonSegment,bounded)( ·(TM,_TM·CVT_) tm ){ + return true; + } + Local ·(extent_t,_TM·CVT_) ·(TM,_TM·CVT_,SingletonSegment,extent)( ·(TM,_TM·CVT_) tm ){ + return 0; + } + Local TM·Status ·(TM,_TM·CVT_,SingletonSegment,status)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; + if( !t->hd ) return TM·Status·dismounted; + return TM·Status·leftmost | TM·Status·rightmost; + } + Local bool ·(TM,_TM·CVT_,SingletonSegment,dismounted)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; + return !t->hd; + } + + // these could be pulled from the tm.pft table, and defined once + Local bool ·(TM,_TM·CVT_,SingletonSegment,on_tape)( ·(TM,_TM·CVT_) tm ){ + return ·(TM,_TM·CVT_,SingletonSegment,status)( tm ) & TM·Status·on_tape; + } + Local bool ·(TM,_TM·CVT_,SingletonSegment,on_leftmost)( ·(TM,_TM·CVT_) tm ){ + return ·(TM,_TM·CVT_,SingletonSegment,status)( tm ) & TM·Status·leftmost; + } + Local bool ·(TM,_TM·CVT_,SingletonSegment,on_rightmost)( ·(TM,_TM·CVT_) tm ){ + return ·(TM,_TM·CVT_,SingletonSegment,status)( tm ) & TM·Status·rightmost; + } + + // does nothing if tape is already mounted + Local void ·(TM,_TM·CVT_,SingletonSegment,mount)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; + t->hd = true; + } + Local void ·(TM,_TM·CVT_,SingletonSegment,dismount)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; + t->hd = false; + } + + Local void ·(TM,_TM·CVT_,SingletonSegment,s)( ·(TM,_TM·CVT_) tm ){ + assert(0); + } + Local void ·(TM,_TM·CVT_,SingletonSegment,step_left)( ·(TM,_TM·CVT_) tm ){ + assert(0); + } + Local void ·(TM,_TM·CVT_,SingletonSegment,rewind)( ·(TM,_TM·CVT_) tm ){ + return; + } + + Local _TM·CVT_ ·(TM,_TM·CVT_,SingletonSegment,r)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; + return t->value; + } + Local void ·(TM,_TM·CVT_,SingletonSegment,w)( ·(TM,_TM·CVT_) tm ,_TM·CVT_ *remote_pt ){ + ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t = (·(TM,_TM·CVT_,SingletonSegment,Tableau) *) tm.tableau; + t->value = *remote_pt; + } + + Local ·(TM,_TM·CVT_,PFT) ·(TM,_TM·CVT_,SingletonSegment,pft) = { + + .topo = ·(TM,_TM·CVT_,SingletonSegment,topo) + ,.bounded = ·(TM,_TM·CVT_,SingletonSegment,bounded) + ,.extent = ·(TM,_TM·CVT_,SingletonSegment,extent) + + ,.status = ·(TM,_TM·CVT_,SingletonSegment,status) + ,.dismounted = ·(TM,_TM·CVT_,SingletonSegment,dismounted) + ,.on_tape = ·(TM,_TM·CVT_,SingletonSegment,on_tape) + ,.on_leftmost = ·(TM,_TM·CVT_,SingletonSegment,on_leftmost) + ,.on_rightmost = ·(TM,_TM·CVT_,SingletonSegment,on_rightmost) + + ,.mount = ·(TM,_TM·CVT_,SingletonSegment,mount) + ,.dismount = ·(TM,_TM·CVT_,SingletonSegment,dismount) + + ,.step = ·(TM,_TM·CVT_,SingletonSegment,s) + ,.step_left = ·(TM,_TM·CVT_,SingletonSegment,step_left) + ,.rewind = ·(TM,_TM·CVT_,SingletonSegment,rewind) + + ,.r = ·(TM,_TM·CVT_,SingletonSegment,r) + ,.w = ·(TM,_TM·CVT_,SingletonSegment,w) + + }; + + /* + tm is up casted from being array specific, to being generic. Later it is downcasted within the array code before being used. This can be seen at the top of each of the array specific function. This is the only loss of static type safety, and it is embedded in the library code. + */ + ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,SingletonSegment,init)( + ·(TM,_TM·CVT_,SingletonSegment,Tableau) *t + ,_TM·CVT_ initial_value + ){ + t->hd = true; + t->value = initial_value; + + ·(TM,_TM·CVT_) tm = { + .tableau = (·(TM,_TM·CVT_,Tableau) *)t + ,.pft = &·(TM,_TM·CVT_,SingletonSegment,pft) + }; + + return tm; + } + + #endif // #if BOOLEAN(NOT_IN(TM·LOCAL ,TM)) + #endif // #ifdef _TM·CVT_ + +#endif // LOCAL + +/*-------------------------------------------------------------------------------- + Library - compiled into a lib.a file by the current make + Core currently has no library components +--------------------------------------------------------------------------------*/ +#ifdef LIBRARY +#endif + diff --git "a/developer/cc\360\237\226\211/TM\302\267ZeroLength.lib.c" "b/developer/cc\360\237\226\211/TM\302\267ZeroLength.lib.c" new file mode 100644 index 0000000..861c7a9 --- /dev/null +++ "b/developer/cc\360\237\226\211/TM\302\267ZeroLength.lib.c" @@ -0,0 +1,180 @@ +/* + Namespace: TM·ZeroLength + + Template parameters: + + `_TM·CVT_` Cell Value Type`. + +*/ +#include "TM.lib.c" + +/*-------------------------------------------------------------------------------- + Interface +--------------------------------------------------------------------------------*/ + +// once per translation unit +#ifndef TM·ZeroLength·FACE +#define TM·ZeroLength·FACE + + #define TM·ZeroLength·DEBUG + #ifdef TM·ZeroLength·DEBUG + #include + #endif + +#endif //#ifndef TM·FACE + +// once per _TM·CVT_ value +// Caller must #define SET_Binding__TM·ZeroLength·, after inclusion, to prevent re-inclusion +#ifdef _TM·CVT_ +#if BOOLEAN( NOT_IN(Binding ,·(TM·ZeroLength,_TM·CVT_)) ) +#ifdef TM·ZeroLength·DEBUG + #pragma message( "Creating TM·ZeroLength type with a CVT of:" STR_VAL(_TM·CVT_) ) +#endif + + typedef struct{ + bool hd; + } ·(TM,_TM·CVT_,ZeroLength,Tableau); + + ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,ZeroLength,init)( + ·(TM,_TM·CVT_,ZeroLength,Tableau) *t + ); + +#endif +#endif + +/*-------------------------------------------------------------------------------- + Local +--------------------------------------------------------------------------------*/ +#ifdef LOCAL + + // once per translation unit + #ifndef TM·ZeroLength·LOCAL + #define TM·ZeroLength·LOCAL + + #endif + + // once per _TM·CVT_ value + // Caller must #define SET_TM·ZeroLength·LOCAL__TM·, after inclusion, to prevent re-inclusion + #ifdef _TM·CVT_ + #if BOOLEAN(NOT_IN(TM·LOCAL ,·(TM·ZeroLength,_TM·CVT_))) + #ifdef TM·ZeroLength·DEBUG + #pragma message( "Including TM·ZeroLength LOCAL code for:" STR_VAL(_TM·CVT_) ) + #endif + + Local TM·Topo ·(TM,_TM·CVT_,ZeroLength,topo)( ·(TM,_TM·CVT_) tm ){ + return TM·Topo·zero_length; + } + + Local bool ·(TM,_TM·CVT_,ZeroLength,bounded)( ·(TM,_TM·CVT_) tm ){ + return true; + } + + Local ·(extent_t,_TM·CVT_) ·(TM,_TM·CVT_,ZeroLength,extent)( ·(TM,_TM·CVT_) tm ){ + assert(0); + } + + Local TM·Status ·(TM,_TM·CVT_,ZeroLength,status)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; + if( !t->hd ) return TM·Status·dismounted; + return TM·Status·out_of_area; + } + + Local bool ·(TM,_TM·CVT_,ZeroLength,dismounted)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; + return !t->hd; + } + + Local bool ·(TM,_TM·CVT_,ZeroLength,on_tape)( ·(TM,_TM·CVT_) tm ){ + return false; + } + + Local bool ·(TM,_TM·CVT_,ZeroLength,on_leftmost)( ·(TM,_TM·CVT_) tm ){ + return false; + } + + Local bool ·(TM,_TM·CVT_,ZeroLength,on_rightmost)( ·(TM,_TM·CVT_) tm ){ + return false; + } + + // does nothing if tape is already mounted + Local void ·(TM,_TM·CVT_,ZeroLength,mount)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; + if( !t->hd ) t->hd = true; + } + + Local void ·(TM,_TM·CVT_,ZeroLength,dismount)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; + t->hd = false; + } + + Local void ·(TM,_TM·CVT_,ZeroLength,s)( ·(TM,_TM·CVT_) tm ){ + assert(0); + } + + Local void ·(TM,_TM·CVT_,ZeroLength,step_left)( ·(TM,_TM·CVT_) tm ){ + assert(0); + } + + // rewind does nothing if the tape is dismounted + Local void ·(TM,_TM·CVT_,ZeroLength,rewind)( ·(TM,_TM·CVT_) tm ){ + ·(TM,_TM·CVT_,ZeroLength,Tableau) *t = (·(TM,_TM·CVT_,ZeroLength,Tableau) *) tm.tableau; + if( ·(TM,_TM·CVT_,ZeroLength,dismounted)( tm ) ) return; + assert(0); + } + + Local _TM·CVT_ ·(TM,_TM·CVT_,ZeroLength,r)( ·(TM,_TM·CVT_) tm ){ + assert(0); + } + + Local void ·(TM,_TM·CVT_,ZeroLength,w)( ·(TM,_TM·CVT_) tm ,_TM·CVT_ *remote_pt ){ + assert(0); + } + + Local ·(TM,_TM·CVT_,PFT) ·(TM,_TM·CVT_,ZeroLength,pft) = { + + .topo = ·(TM,_TM·CVT_,ZeroLength,topo) + ,.bounded = ·(TM,_TM·CVT_,ZeroLength,bounded) + ,.extent = ·(TM,_TM·CVT_,ZeroLength,extent) + + ,.status = ·(TM,_TM·CVT_,ZeroLength,status) + ,.dismounted = ·(TM,_TM·CVT_,ZeroLength,dismounted) + ,.on_tape = ·(TM,_TM·CVT_,ZeroLength,on_tape) + ,.on_leftmost = ·(TM,_TM·CVT_,ZeroLength,on_leftmost) + ,.on_rightmost = ·(TM,_TM·CVT_,ZeroLength,on_rightmost) + + ,.mount = ·(TM,_TM·CVT_,ZeroLength,mount) + ,.dismount = ·(TM,_TM·CVT_,ZeroLength,dismount) + + ,.step = ·(TM,_TM·CVT_,ZeroLength,s) + ,.step_left = ·(TM,_TM·CVT_,ZeroLength,step_left) + ,.rewind = ·(TM,_TM·CVT_,ZeroLength,rewind) + + ,.r = ·(TM,_TM·CVT_,ZeroLength,r) + ,.w = ·(TM,_TM·CVT_,ZeroLength,w) + + }; + + ·(TM,_TM·CVT_) ·(TM,_TM·CVT_,ZeroLength,init)( + ·(TM,_TM·CVT_,ZeroLength,Tableau) *t + ){ + t->hd = true; + ·(TM,_TM·CVT_) tm = { + .tableau = (·(TM,_TM·CVT_,Tableau) *)t + ,.pft = &·(TM,_TM·CVT_,ZeroLength,pft) + }; + return tm; + } + + + #endif // #if BOOLEAN(NOT_IN(TM·LOCAL ,TM)) + #endif // #ifdef _TM·CVT_ + +#endif // LOCAL + +/*-------------------------------------------------------------------------------- + Library - compiled into a lib.a file by the current make + Core currently has no library components +--------------------------------------------------------------------------------*/ +#ifdef LIBRARY +#endif + diff --git "a/developer/cc\360\237\226\211/cpp_ext.c" "b/developer/cc\360\237\226\211/cpp_ext.c" index 54374fe..6cff205 100644 --- "a/developer/cc\360\237\226\211/cpp_ext.c" +++ "b/developer/cc\360\237\226\211/cpp_ext.c" @@ -1,4 +1,3 @@ - #ifndef CPP_EXT #define CPP_EXT diff --git "a/developer/cc\360\237\226\211/cpp_ext_0.c" "b/developer/cc\360\237\226\211/cpp_ext_0.c" index 81cd43e..a04d08d 100644 --- "a/developer/cc\360\237\226\211/cpp_ext_0.c" +++ "b/developer/cc\360\237\226\211/cpp_ext_0.c" @@ -168,14 +168,14 @@ LOGIC For example a set named TRIP with 1 ,2 ,3 in it: - #define SET__TRIP__1 - #define SET__TRIP__2 - #define SET__TRIP__3 + #define SET_TRIP__1 + #define SET_TRIP__2 + #define SET_TRIP__3 */ -#define IN(name ,x) NOT(CAT4(SET__ ,name ,__ ,x)) -#define NOT_IN(name ,x) CAT4(SET__ ,name ,__ ,x) +#define IN(name ,x) NOT(CAT4(SET_ ,name ,__ ,x)) +#define NOT_IN(name ,x) CAT4(SET_ ,name ,__ ,x) /*--------------------------------------------------------------------------- diff --git "a/developer/cc\360\237\226\211/Map.lib.c" "b/developer/deprecated\360\237\226\211/Map.lib.c" similarity index 100% rename from "developer/cc\360\237\226\211/Map.lib.c" rename to "developer/deprecated\360\237\226\211/Map.lib.c" diff --git "a/developer/cc\360\237\226\211/Map2.lib.c" "b/developer/deprecated\360\237\226\211/Map2.lib.c" similarity index 100% rename from "developer/cc\360\237\226\211/Map2.lib.c" rename to "developer/deprecated\360\237\226\211/Map2.lib.c" diff --git "a/developer/cc\360\237\226\211/scatch.c" "b/developer/deprecated\360\237\226\211/scatch.c" similarity index 100% rename from "developer/cc\360\237\226\211/scatch.c" rename to "developer/deprecated\360\237\226\211/scatch.c" diff --git "a/developer/document\360\237\226\211/Binding.org" "b/developer/document\360\237\226\211/Binding.org" new file mode 100644 index 0000000..31ca2a4 --- /dev/null +++ "b/developer/document\360\237\226\211/Binding.org" @@ -0,0 +1,170 @@ +#+TITLE: FG Tables and Bindings in RT C +#+AUTHOR: Sorein +#+DATE: 2025-04-25 + +* 1. Overview: FG Tables Revisited + +RT C uses **Function-Given (FG) Tables** to group related functions that all take a **common first argument**. This enables flexible polymorphism and modular encapsulation in pure C. + +For a full explanation of FG tables and an example based on `Core`, see: + +**📎 [[file:fg_tables_core.org][FG Tables in RT C — The Core Example]]** + +In this model: +- Each module defines a **binding struct** (e.g. `TM·AU`, `Core`, etc). +- All methods take the binding as their first argument. +- A function pointer table (FG table) is associated with the binding. +- A macro `Module·call(binding ,method ,...)` expands to safe, type-dispatched function calls. + +* 2. The Tableau: Abstract Identity of the Binding + +In the FG model, we say that functions are *given* a binding. The binding is always a `struct` that pairs: + +1. A **tableau** (a pointer to the module-specific state) +2. An **FG table** (function dispatch table) + +The **tableau** is the key abstraction. + +- It is typically **only ever passed to the functions** in the FG table. +- Therefore, the FG table **defines the meaning** of the tableau: it specifies what functions expect and how they interpret the tableau pointer. +- The tableau has a *type in memory* (e.g. `TM·AU·Array·Tableau`), but also an **abstract type**, as defined by the FG table itself. + +In that sense, the FG table acts as **the type descriptor for the tableau**. + +* 3. Binding.lib.c + +The module `Binding.lib.c` defines the canonical layout of an FG-style binding. + +Below is the full source (excluding comments), organized by section. + +**FACE:** +#+BEGIN_SRC c +#ifndef Binding·FACE +#define Binding·FACE + +typedef struct{ + void *tableau; + void *FG; +} Binding; + +#endif +#+END_SRC + +This is the public interface. The type `Binding` is a generic struct that holds two pointers: +- `tableau`: the implementation-specific data (tape, buffer, object, etc) +- `FG`: pointer to a module-specific function table + +**IMPLEMENTATION:** +#+BEGIN_SRC c +#ifdef Binding·IMPLEMENTATION +#endif +#+END_SRC + +No definitions are required here—the binding struct has no behavior of its own. + +**LOCAL:** +#+BEGIN_SRC c +#ifdef LOCAL +#ifndef Binding·LOCAL +#define Binding·LOCAL + +#include +#include + +#endif +#endif +#+END_SRC + +These are the headers required to define the structure and the environment. It also follows the **RT C sectioning model** described in: + +**📎 [[file:sections.org][RT C File Structure and Sectioning]]** + +* 4. Template Use + +Although `Binding.lib.c` does not directly use template parameters, it is often **included repeatedly** in templated modules to create per-instance bindings. + +For example: +#+BEGIN_SRC c +#define _TM·CVT_ AU +#include "TM.lib.c" +#define SET__Binding__TM·AU +#+END_SRC + +The template name `_TM·CVT_` is used to create: +- `typedef struct TM·AU TM·AU;` +- `typedef struct TM·AU·Array·Tableau TM·AU·Array·Tableau;` +- `TM·AU` instances, each of which is a `Binding` with layout and dispatch tied to a particular tableau type. + +See: + +**📎 [[file:template_box_example.org][Templating in RT C — The Box Example]]** + +* 5. The Binding Struct + +Here’s the struct that every FG-style binding uses: + +#+BEGIN_SRC c +typedef struct{ + void *tableau; + void *FG; +} Binding; +#+END_SRC + +The tableau and FG pointers are opaque to the caller. They are interpreted by the functions in the FG table. + +**The binding is the concrete object passed around the system.** + +In most modules, this struct is **re-wrapped** in a typedef, e.g.: + +#+BEGIN_SRC c +typedef Binding TM·AU; +#+END_SRC + +This means that in function signatures and argument lists, the **binding is visible under its module-specific name**, even though all bindings have the same physical layout. + +This separation allows: +- Static type safety at the source level (per module) +- Shared representation at the binary level + +* 6. Example Usage + +Suppose we define a tape machine `TM·AU` over a byte array. The setup might look like: + +#+BEGIN_SRC c +AU tape[] = {0x01 ,0x02 ,0x03}; +extent_t·AU extent = 2; + +TM·AU·Array·Tableau t; +TM·AU tm = TM·AU·Array·init_pe(&t ,tape ,extent); + +if( TM·AU·call(tm ,on_tape) ){ + uchar x = TM·AU·call(tm ,read); + printf("Head reads: %02x\n", x); +} +#+END_SRC + +Here: +- `tm` is a `TM·AU` binding — a `struct` with `.tableau = &t`, and `.FG = &TM·AU·Array·fg`. +- The functions in the FG table dereference `tm.tableau` into the expected type. +- `TM·AU·call` wraps method access, validating the binding under debug builds. + +* 7. Summary + +A **binding** in RT C is: +- A pair of `(tableau pointer, FG table pointer)` +- Constructed per module or template instantiation +- Passed around as the first argument to all FG methods +- Given a distinct *type name* (like `TM·AU`) to encode its role + +A **tableau** is: +- The backing data storage (often a `struct`) +- Interpreted only by the FG methods that operate on it +- Abstractly defined by the FG table it's paired with + +This design gives RT C the benefits of: +- Polymorphism +- Type encapsulation +- Dispatch +- Template instantiation + +All in a clean, structured C style, without runtime type metadata or compiler extensions. diff --git "a/developer/document\360\237\226\211/FG_tables.org" "b/developer/document\360\237\226\211/FG_tables.org" new file mode 100644 index 0000000..797b909 --- /dev/null +++ "b/developer/document\360\237\226\211/FG_tables.org" @@ -0,0 +1,113 @@ +* Function-Given (FG) Tables in RT C +:PROPERTIES: +:AUTHOR: Sorein +:DATE: 2025-04-25 +:END: + +This document introduces **FG Tables**—Function-Given tables, a structured method in RT C for grouping related functions that operate on a common type or binding. We use the `Core` module as a canonical example, as it contains no template variables or tableaux and thus provides the cleanest view. + +**FG Tables** serve a purpose similar to vtables or method dictionaries: they allow operations to be defined once and called generically, using a consistent interface. Unlike C++ vtables, FG tables are explicit, statically defined, and layered via macros in a readable, extensible style. + +**Key concepts:** +- All function signatures take a common first argument (usually a pointer to a "binding" struct). +- The table itself is a `struct` of function pointers. +- The module defines: + - The **type** (e.g. `Core`) + - The **binding struct** (`Core·Binding`) + - The **table definition** (`Core·FG`) + - The **table instance** (`Core·Tableau`) + - Helper macros for calling (`Core·call(...)`) and checking (`Core·wellformed_binding(...)`) + +* Example: Core +Core provides utilities that are always available to the RT system. It defines an FG table without templates or specializations. + +**Declaration (in the FACE section)**: +#+BEGIN_SRC c +#ifndef Core·FACE +#define Core·FACE + +typedef struct Core·Binding Core; + +typedef struct{ + void(*Free)(Core*); + bool(*is_aligned)(Core* ,void const*,uint ,bool*); + void const*(*round_up)(Core* ,void const*,uint); + void const*(*round_down)(Core* ,void const*,uint); +} Core·FG; + +bool Core·wellformed_binding(Core*); +#define Core·call(B ,f ,...) ((Core·wellformed_binding(B)) ,(B)->FG->f(B ,__VA_ARGS__)) + +#endif +#+END_SRC + +**Explanation of Functions:** + +- `Free(Core*)`: Frees the binding and sets its pointer to `NULL`. This follows the `Free(pt) = free(pt); pt = NULL;` idiom defined in RT. +- `is_aligned(Core* ,void const* p ,uint alignment ,bool* result)`: Determines whether `p` is aligned to `alignment`. Writes result to `*result`, returns false if `p == NULL`. +- `round_up(Core* ,void const* p ,uint alignment)`: Returns the smallest aligned address ≥ `p`. +- `round_down(Core* ,void const* p ,uint alignment)`: Returns the largest aligned address ≤ `p`. + +All alignment operations use address logic with explicit alignments passed at runtime, rather than compile-time constants. + +* Implementation +The FG table instance is defined in the `Core·IMPLEMENTATION` section: + +#+BEGIN_SRC c +#ifdef Core·IMPLEMENTATION + +bool Core·wellformed_binding(Core* B){ + return B && B->FG == &Core·Tableau; +} + +Local void Core·Free(Core* B){ + Free(B); +} + +Local bool Core·is_aligned(Core* B ,void const* p ,uint alignment ,bool* result){ + if(!p){ *result = false; return false; } + uintptr_t up = (uintptr_t)p; + *result = (up % alignment) == 0; + return true; +} + +Local void const* Core·round_up(Core* B ,void const* p ,uint alignment){ + if(!p) return (void const*)(uintptr_t)alignment; + uintptr_t up = (uintptr_t)p; + return (void const*)((up + alignment - 1)/alignment*alignment); +} + +Local void const* Core·round_down(Core* B ,void const* p ,uint alignment){ + if(!p) return NULL; + uintptr_t up = (uintptr_t)p; + return (void const*)(up / alignment * alignment); +} + +Core·FG const Core·Tableau = { + .Free = Core·Free, + .is_aligned = Core·is_aligned, + .round_up = Core·round_up, + .round_down = Core·round_down +}; + +#endif +#+END_SRC + +* Usage Example +#+BEGIN_SRC c +Core* B = malloc(sizeof(Core)); +B->FG = &Core·Tableau; + +bool aligned; +Core·call(B ,is_aligned ,(void*)0x1000 ,16 ,&aligned); + +void const* r = Core·call(B ,round_up ,(void*)0x1003 ,16); +#+END_SRC + +* Summary +- FG Tables provide modular polymorphism in pure C. +- The `Core` FG is the simplest: no template variables, no tableaux layers. +- The FG naming convention (`Module·FG`) and `call(...)` wrapper provide safety and convenience. +- FG patterns scale to support templated modules with `FG·Type`, `FG·Tableau`, and dispatch guards. + +FG tables are foundational to the RT C architecture, forming the dispatch layer behind modular, template-like polymorphism in a static language. diff --git "a/developer/document\360\237\226\211/TapeMachine_howto.org" "b/developer/document\360\237\226\211/TapeMachine_howto.org" new file mode 100644 index 0000000..f156c23 --- /dev/null +++ "b/developer/document\360\237\226\211/TapeMachine_howto.org" @@ -0,0 +1,145 @@ +#+TITLE: How to Use a TM: Tape Machine Structure and Semantics +#+AUTHOR: Sorein +#+DATE: 2025-04-25 + +* 1. Introduction + +The `TM` module in RT C implements a **Tape Machine** abstraction—a generic, forward/backward traversable sequence with a *head*, *bounded extent*, and *cell value type* (CVT). + +Each instantiated TM (e.g. `TM·AU`, `TM·Str`) is a **binding** that combines: +- A `tableau` — the backing data or representation (e.g. array, singleton, zero-length) +- An `FG table` — the dispatch logic defining how the head behaves + +TM is not a container. It is a *lens* or *state machine* for traversing memory in a structured way. + +* 2. Constructing a TM + +To construct a TM instance, you typically: +1. Define the tape data (e.g. an array of AU or Str) +2. Define its extent +3. Allocate a `Tableau` struct (e.g. `TM·AU·Array·Tableau`) +4. Initialize the TM using `init_pe` or `init_pp` + +#+BEGIN_SRC c +AU tape1[] = {0xAA ,0x55 ,0xC2}; +extent_t·AU extent1 = sizeof(tape1) / sizeof(AU) - 1; + +TM·AU·Array·Tableau t1; +TM·AU tm1 = TM·AU·Array·init_pe(&t1 ,tape1 ,extent1); +#+END_SRC + +The resulting `tm1` is a **binding**—you pass it to functions via `Binding·call` or `TM·AU·call`. + +* 3. TM Method Overview + +The key methods in the TM FG table are: + +| Method | Description | +|--------------------+--------------------------------------------------| +| `mount` | Reattach head to the tape if dismounted | +| `dismount` | Detach the head (mark as inactive) | +| `status` | Returns the full head status bitmask | +| `on_tape` | True if the head is on a valid cell | +| `on_leftmost` | True if head is at the leftmost cell | +| `on_rightmost` | True if head is at the rightmost cell | +| `step`, `step_left`| Move head forward or backward | +| `rewind` | Move head back to its starting position | +| `read` | Return the cell value under the head | +| `write` | Overwrite the cell under the head | + +* 4. Loop Structure: Prefix, Separator, Postfix + +Traversal is typically done with **guarded middle-exit loops**, allowing for insertion of: + +- A **prefix** (runs before loop) +- A **separator** (runs between each item) +- A **postfix** (runs after loop) + +Example pattern (printing a tape with separators): +#+BEGIN_SRC c +if( Binding·call(tm ,on_tape) ){ + // Prefix + do{ + // Body + printf("%02x", (unsigned int) Binding·call(tm ,read)); + + // Guarded middle exit + if( Binding·call(tm ,on_rightmost) ) break; + + // Separator + putchar(' '); + + // Step + Binding·call(tm ,step); + }while(1); + // Postfix + putchar('\n'); +} +#+END_SRC + +This avoids the need for counter variables, array indexing, or special cases for first/last iteration. + +* 5. Example: Nested TM Traversal + +The following example demonstrates two tapes—`tm1` of bytes, and `tm2` of strings—printing a byte followed by the full string tape on each outer step. + +#+BEGIN_SRC c +if( Binding·call(tm1 ,on_tape) && Binding·call(tm2 ,on_tape) ){ + do{ + // Prefix of outer loop + printf("%02x\n", (unsigned int) Binding·call(tm1 ,read)); + putchar(' '); + putchar(' '); + + // Inner loop: iterate over strings + do{ + printf("%s", Binding·call(tm2 ,read)); + if( Binding·call(tm2 ,on_rightmost) ) break; + putchar(' '); + Binding·call(tm2 ,step); + }while(1); + + // Postfix of inner loop + putchar('\n'); + + // Guarded exit + if( Binding·call(tm1 ,on_rightmost) ) break; + + // Advance outer head + Binding·call(tm1 ,step); + + // Reset inner head + Binding·call(tm2 ,rewind); + }while(1); + + // Final postfix + printf("\n"); +} +#+END_SRC + +This structure supports: +- Interleaved traversal of coextensive tapes +- Mid-line formatting +- Reusable subroutines for iteration + +* 6. Debugging Tips + +- Use `on_tape`, `on_rightmost`, and `status` to check head validity before reading. +- `rewind` is always safe to call, even on a dismounted tape. +- `dismount` prevents accidental traversal if a tape becomes invalid or externally reallocated. + +* 7. Summary + +The Tape Machine abstraction supports: +- Generic data traversal +- Separation of structure (tableau) from behavior (FG table) +- Elegant loop patterns with predictable control flow +- Multi-instance coexistence via templated bindings + +By adopting TMs, RT C code gains clarity and uniformity when working over ranges, buffers, or token streams—without abandoning type safety or performance. + +For detailed reference on bindings and FG tables, see: + +**📎 [[file:fg_bindings_and_tableaux.org][FG Tables and Bindings in RT C]]** + +**📎 [[file:fg_tables_core.org][FG Tables — Core Module Example]]** diff --git "a/developer/document\360\237\226\211/parameterized_functions.org" "b/developer/document\360\237\226\211/parameterized_functions.org" new file mode 100644 index 0000000..26d1c6a --- /dev/null +++ "b/developer/document\360\237\226\211/parameterized_functions.org" @@ -0,0 +1,120 @@ +* Parameterized Functions + Author: Thomas Walker Lynch / Drafted by Caerith + +* 1. Parameterization in Mathematics +In mathematics, **parameters** are used to define structured families of functions. For example, consider the family: + +#+BEGIN_SRC +{ f_t(x) = t * x, g_t(y) = y + t^2, h_t(z) = sin(tz) } +#+END_SRC + +Each function in this family shares a symbolic parameter `t`, which organizes the family and distinguishes its members. The functions differ in behavior based on the fixed value of `t`, even though they operate on different primary arguments (`x`, `y`, `z`). + +This reveals the core role of a parameter in mathematics: it does not merely serve as an argument to a single function, but rather defines **a space of functions** — a higher-order structure from which individual functions can be selected by fixing the parameter. + +In this context, we say: +> A parameter is an external symbolic structure that appears as an argument in each function, but whose true role is to *coordinate or classify* the family of functions as a whole. + +Once a value is chosen for the parameter, it becomes fixed, and the resulting function behaves purely in terms of the remaining arguments. The collection \( \{f_t, g_t, h_t\} \) for varying `t` forms a **parameterized family**, and the parameter gives it structure. + +* 2. The Confusion in Computer Science +In computer science, the term "parameter" is typically conflated with what are more properly called arguments. One speaks of a "parameter list" when defining a function, but these are just **argument symbols**, and at runtime, **argument values** are supplied. + +To clarify: +- An **argument symbol** is a variable used in a function definition. +- An **argument value** is an input supplied at invocation. + +We reserve **parameter** to mean: *a symbolic value that organizes or shapes a function or function family*. This returns us to the mathematical intent. + +Seen from this angle, **object-oriented programming** is a way of constructing **families of parameterized functions** — each method implicitly taking the object (`this`) as a shared structure. That object acts as a **fixed symbolic input** across many functions: it is the parameter. The set of methods thus defines a family. + +- For one parameter (i.e., one receiver object), the system is straightforward. +- For two, ambiguity emerges: whose methods govern? This gives rise to multiple dispatch, traits, and other formal structures. + +Thus, **object-orientation is a particular implementation of parameterized function families**, where the parameter is embedded as implicit context. + +* 3. When Parameters Can Change: Machines +In pure mathematics, the parameter is fixed during evaluation. But when a function can *modify* its parameter — i.e., mutate the context it depends on — then we are no longer dealing with functions in the mathematical sense. + +> When the parameter is no longer constant, but mutable, it becomes **state**. + +A function family with a mutable parameter is not a function family at all — it is a **machine**. The state evolves over time, and each function application may affect future behavior. + +This is a transition from **functional** to **stateful** systems. The parameter becomes a **tableau**: a symbolic structure that holds state, arguments, results, and evolves during execution. It is the parameter made writable, and the environment through which computational interaction unfolds. + +A tableau is not limited to a single function family — it may participate in multiple. It is both an input/output workspace and a memory of prior execution. + +In this view, TTCA and similar systems operate not just with functions, but with machines — bundles of callable behaviors that mutate their shared tableau. + +* 4. Our Terminology +To capture these distinctions, we adopt the following terminology: + +- **PFT**: A *Parameterized Function Table* over carrier type `T`. This is a symbolic table of functions that each expect a `T` as their first argument. +- **M** or **Machine**: A special case of PFT where `T` is not constant but a **tableau**, and may be mutated during evaluation. +- **Tableau**: A symbolic structure that accumulates inputs, stores return values, and evolves during execution. It is both interface and state — a writable parameter and a staging area for symbolic computation. It generalizes a stack frame and may serve multiple function families simultaneously. + +This language aligns our system with mathematical clarity while preserving the structural richness of the tableau concept. + +* 5. The Parameter Connector: Binding Parameters to Function Families +In mathematics, writing a subscript such as `f_t(x)` indicates that a function family `f` has been **partially applied** by fixing its parameter `t`. This is called **partial application** — and it represents the act of creating a specific instance of a function from a broader, parameterized family. + +In our system, we reflect this idea using a symbolic structure called the **Parameter Connector**. + +> A **Parameter Connector** is a type that declares how a specific parameter (e.g., a `Tableau`) is to be coupled with a Parameterized Function Table (PFT). It is the symbolic form that supports partial application and prepares the ground for dispatch. + +The macro: + +#+BEGIN_SRC c +DECLARE_PARAMETER_CONNECTOR(MyType) +#+END_SRC + +declares a `struct` named `MyType`, which contains: +- a pointer to a `MyType_Tableau` (the parameter value) +- a pointer to a `MyType_PFT` (the function table) + +This struct is the **parameter connector**. It does not yet perform binding, but defines the shape of a pairing. Once an instance is created — with the parameter value assigned — we may dispatch calls via: + +#+BEGIN_SRC c +call(connector, fn_name, args...); +#+END_SRC + +This pattern reflects the subscripting act in mathematics. The `connector` serves as the **parameter-binding context**: it is what affixes the symbolic `t` to the `f` in `f_t(x)`. + +In this way: +- **The connector is to `call()` what a subscript is to a function name**. +- It allows partial application of parameterized function tables. +- It forms the bridge from symbolic family to concrete callable form. + +Thus, the **parameter connector** is the central structure that enables meaningful dispatch in a system of parameterized functions — faithful both to mathematical abstraction and to C's structural constraints. + + + + +#+BEGIN_SRC + ┌──────────────────────┐ + │ Function Family │ + └────────┬─────────────┘ + │ + ┌───────────────┼───────────────┐ + ▼ ▼ +┌──────────────┐ ┌────────────────────┐ +│ Parameter t │ │ Parameterized │ +│ (symbolic) │ │ Function Table PFT │ +└──────┬───────┘ └────────┬───────────┘ + ▼ ▼ + ┌───────────────────────────────────┐ + │ Partial Application Step │ + └──────────────┬────────────────────┘ + ▼ + ┌────────────────────────┐ + │ Parameter Connector │ + └────────────┬───────────┘ + ▼ + ┌─────────────┐ + │ call() │ + └────┬────────┘ + ▼ + ┌───────────────┐ + │ Machine │ + └───────────────┘ +#+END_SRC diff --git "a/developer/document\360\237\226\211/source_file_sectioins.org" "b/developer/document\360\237\226\211/source_file_sectioins.org" new file mode 100644 index 0000000..48d0573 --- /dev/null +++ "b/developer/document\360\237\226\211/source_file_sectioins.org" @@ -0,0 +1,107 @@ +#+TITLE: RT Library Structure Guide +#+AUTHOR: Sorein (on request by Thomas) +#+DATE: 2025-04-25 + +* Purpose +This document describes the architectural sections in `*.lib.c` files of the RT codebase. +It explains the use of `#if`-guarded blocks including `FACE`, `LOCAL`, `LIBRARY`, and template instantiations. + +* Section Overview + +** FACE :: Public Interface and Template Declaration +#+BEGIN_SRC c +#ifndef Module·FACE +#define Module·FACE +... +#endif +#+END_SRC + +- Declares types, enums, constants, and FG tables. +- Includes other modules (`Core.lib.c`, `cpp_ext.c`). +- Safe to include multiple times. +- No runtime state or implementation logic. + +** LOCAL :: Private Implementations and Table Initialization +#+BEGIN_SRC c +#ifdef LOCAL +#ifndef Module·LOCAL +#define Module·LOCAL +... +#endif +#endif +#+END_SRC + +- Defines functions, local constants, and FG table initializations. +- Only included when `LOCAL` is defined. +- Hidden from consumers. +- Use guards to prevent duplicate inclusion. + +** LIBRARY :: Compiled Static Library Content +#+BEGIN_SRC c +#ifdef LIBRARY +... +#endif +#+END_SRC + +- Reserved for future components to be compiled into a `.a` archive. +- Currently unused in `Core`, `TM`, or `Binding`. +- Separates linkable components from inline-included ones. + +** Template Parameters :: Type-Specific Inclusion Guards +#+BEGIN_SRC c +#ifdef _TM·CVT_ +#if BOOLEAN( NOT_IN(Binding ,TM·) ) +... +#endif +#endif +#+END_SRC + +- Allows per-type instantiation (e.g. `TM·AU`, `TM·Str`). +- Ensures that each instantiation happens only once. +- Guards must be defined by the *caller*, e.g.: + #+BEGIN_SRC c + #define _TM·CVT_ AU + #include "TM.lib.c" + #define SET__Binding__TM·AU + #+END_SRC + +** Undef Section :: Template Parameter Cleanup +#+BEGIN_SRC c +#undef _TM·CVT_ +#+END_SRC + +- Prevents leakage of template macros between inclusions. + +* Summary Table + +#+ATTR_LATEX: :environment tabular :align |l|l|l|l| +| *Section* | *Guard Macro* | *Purpose* | *Include Frequency* | +|-----------------+-------------------------+------------------------------------------------+-----------------------------| +| FACE | #ifndef Module·FACE | Public declarations, typedefs, constants | Once per TU or header | +| LOCAL | #ifdef LOCAL | Function definitions, internal state | Only in .cli.c or test file | +| LIBRARY | #ifdef LIBRARY | Static linkable content (future use) | Optional | +| Template Block | #ifdef _TEMPLATE_... | Per-template instantiation | Once per unique value | +| Undef Section | #undef _TEMPLATE_... | Cleanup template identifiers | Always | + +* Best Practices + +- **Order matters:** Include `FACE` before defining templates or using macros. +- **Avoid leakage:** Always `#undef` template variables after instantiation. +- **Limit `FACE` to declarations:** Do not define runtime behavior in `FACE`. +- **Use `LOCAL` in a single TU:** Only one translation unit should include `LOCAL` per template. +- **Separate compile/link concerns:** Use `LIBRARY` only for code compiled outside `cli`. + +* Example + +To use `TM·AU` and `TM·Str` in the same translation unit: +#+BEGIN_SRC c +#define _TM·CVT_ AU +#include "TM.lib.c" +#define SET__Binding__TM·AU + +#define _TM·CVT_ Str +#include "TM.lib.c" +#define SET__Binding__TM·Str" +#+END_SRC + +* End diff --git "a/developer/document\360\237\226\211/template_in_C.org" "b/developer/document\360\237\226\211/template_in_C.org" new file mode 100644 index 0000000..e723a42 --- /dev/null +++ "b/developer/document\360\237\226\211/template_in_C.org" @@ -0,0 +1,83 @@ +* Minimal Templating in RT C: The Box Example +:PROPERTIES: +:AUTHOR: Sorein +:DATE: 2025-04-25 +:END: + +This document presents a minimal and idiomatic example of **templating in RT C**, using a generic "box" type. + +We follow the RT convention for template macros: +- Template parameters are named with **leading and trailing underscores**, e.g. `_Box_T_`. +- A **set macro** (e.g. `SET__Box__int`) must be defined after inclusion to prevent duplicate instantiations. + +This example avoids FG tables, tableaux, or polymorphism—it exists purely to show type reuse through macro-based inclusion. + +* Template Logic: box_template.h + +This header is included multiple times, once per type. It expects `_Box_T_` to be defined. + +#+BEGIN_SRC c +#ifndef _Box_T_ +#error "_Box_T_ must be defined before including box_template.h" +#endif + +#if !defined(·(SET__Box,_Box_T_)) +#define ·(SET__Box,_Box_T_) + +typedef struct{ + _Box_T_ value; +} ·(Box_Box,_Box_T_); + +void ·(Box_set,_Box_T_)( ·(Box_Box,_Box_T_)* b ,_Box_T_ x ){ + b->value = x; +} + +_Box_T_ ·(Box_get,_Box_T_)( ·(Box_Box,_Box_T_)* b ){ + return b->value; +} + +#endif +#+END_SRC + +* Instantiating the Template + +You instantiate the template by defining `_Box_T_` before inclusion. Afterward, define the `SET__...` macro to guard against repeat. + +#+BEGIN_SRC c +#define _Box_T_ int +#include "box_template.h" +#define SET__Box__int + +#define _Box_T_ char* +#include "box_template.h" +#define SET__Box__char_ptr +#+END_SRC + +* Example Usage + +Once the template is instantiated, you can use the generated types and functions. + +#+BEGIN_SRC c +#include + +int main(){ + ·(Box_Box,int) a; + ·(Box_set,int)(&a ,42); + printf("a = %d\n", ·(Box_get,int)(&a)); + + ·(Box_Box,char*) b; + ·(Box_set,char*)(&b ,"hello"); + printf("b = %s\n", ·(Box_get,char*)(&b)); + + return 0; +} +#+END_SRC + +* Summary + +This "box" example demonstrates the foundation of RT C templating: +- Code is included once per type with a unique `_Template_Var_`. +- `SET__...` guards prevent duplicate instantiation. +- Type-specific names (`Box_set,int`) are generated using token pasting macros like `·(...)`. + +From here, this pattern scales naturally to complex modules like `TM·AU`, while retaining clarity, reusability, and full type safety. diff --git a/developer/example/0_readme.org b/developer/example/0_readme.org index d8f8a7d..2a4ebb5 100644 --- a/developer/example/0_readme.org +++ b/developer/example/0_readme.org @@ -1,3 +1,9 @@ -To build these standalone edit the tool🖉/makefil and uncommon the SRC=example and the CEFLAGS+= -I/cpp🖉 lines. Then do the usual make clean dependency; make cli +To build these standalone edit the tool🖉/makefile and uncomment: + SRC=example +and + CEFLAGS+= -I/cc🖉 +. + +Then do the usual make clean dependency; make cli diff --git a/developer/example/bespoke.cli.c b/developer/example/bespoke.cli.c index bc3a2ca..3f2732d 100644 --- a/developer/example/bespoke.cli.c +++ b/developer/example/bespoke.cli.c @@ -21,7 +21,7 @@ #define _BINDING_ Bespoke #include "Binding.lib.c" - #define SET__Binding__Bespoke + #define SET_Binding__Bespoke // This defines the FG table type for Bespoke (aka vtable). Each instance is a different implementation of the type sharing the same interface. typedef struct Bespoke·FG{ diff --git a/developer/example/try_TM_1-6.transcript b/developer/example/try_TM_1-6.transcript new file mode 100644 index 0000000..93c2fb3 --- /dev/null +++ b/developer/example/try_TM_1-6.transcript @@ -0,0 +1,274 @@ + +2025-04-25T04:43:48Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> make clean ++ cd /home/Thomas/subu_data/developer/N/developer ++ /bin/make -f tool🖉/makefile clean +rm -f scratchpad/makefile-cc.deps scratchpad/libN.a +for obj in scratchpad/bespoke.cli.o scratchpad/try_TM_1.cli.o scratchpad/try_TM_2.cli.o scratchpad/try_TM_3.cli.o scratchpad/try_TM_4.cli.o scratchpad/try_TM_5.cli.o scratchpad/try_TM_6.cli.o; do rm -f $obj || true; done +for i in machine/bespoke machine/try_TM_1 machine/try_TM_2 machine/try_TM_3 machine/try_TM_4 machine/try_TM_5 machine/try_TM_6; do [ -e $i ] && rm $i || true; done ++ set +x +make done. + +2025-04-25T04:43:57Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> make dependency ++ cd /home/Thomas/subu_data/developer/N/developer ++ /bin/make -f tool🖉/makefile dependency +gcc -Icc🖉 -include "/home/Thomas/subu_data/developer/N/tool_shared/third_party/RT-project-share/release/make/RT_0.h" -I example -MM example/bespoke.cli.c example/try_TM_1.cli.c example/try_TM_2.cli.c example/try_TM_3.cli.c example/try_TM_4.cli.c example/try_TM_5.cli.c example/try_TM_6.cli.c \ + | sed 's|^.*\.o|scratchpad/&|' >> scratchpad/makefile-cc.deps;\ +echo "deps for C linking";\ + # build library:\ +for i in bespoke try_TM_1 try_TM_2 try_TM_3 try_TM_4 try_TM_5 try_TM_6; do\ + echo -e >> scratchpad/makefile-cc.deps;\ + echo -e "machine/$i : scratchpad/$i.cli.o scratchpad/libN.a" >> scratchpad/makefile-cc.deps;\ + echo -e " gcc -o machine/$i scratchpad/$i.cli.o -Lscratchpad -L/lib64 -L/lib -lN" >> scratchpad/makefile-cc.deps;\ +done; +deps for C linking +make: Nothing to be done for 'dependency'. ++ set +x +make done. + +2025-04-25T04:44:01Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> make library ++ cd /home/Thomas/subu_data/developer/N/developer ++ /bin/make -f tool🖉/makefile library +ar rcs scratchpad/libN.a ++ set +x +make done. + +2025-04-25T04:44:07Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> make cli ++ cd /home/Thomas/subu_data/developer/N/developer ++ /bin/make -f tool🖉/makefile cli +make sub_cli ++ cd /home/Thomas/subu_data/developer/N/developer ++ /bin/make -f tool🖉/makefile sub_cli +make[1]: Entering directory '/home/Thomas/subu_data/developer/N/developer' +gcc -Icc🖉 -include "/home/Thomas/subu_data/developer/N/tool_shared/third_party/RT-project-share/release/make/RT_0.h" -I example -o scratchpad/bespoke.cli.o -c example/bespoke.cli.c +In file included from example/bespoke.cli.c:14: +cc🖉/Binding.lib.c:29:13: note: ‘#pragma message: in #ifndef Binding_LIST section’ + 29 | #pragma message( "in #ifndef Binding_LIST section" ) + | ^~~~~~~ +In file included from example/bespoke.cli.c:23: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> Bespoke’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +gcc -o machine/bespoke scratchpad/bespoke.cli.o -Lscratchpad -L/lib64 -L/lib -lN +gcc -Icc🖉 -include "/home/Thomas/subu_data/developer/N/tool_shared/third_party/RT-project-share/release/make/RT_0.h" -I example -o scratchpad/try_TM_1.cli.o -c example/try_TM_1.cli.c +In file included from cc🖉/TM.lib.c:27, + from example/try_TM_1.cli.c:7: +cc🖉/Binding.lib.c:29:13: note: ‘#pragma message: in #ifndef Binding_LIST section’ + 29 | #pragma message( "in #ifndef Binding_LIST section" ) + | ^~~~~~~ +In file included from example/try_TM_1.cli.c:10: +cc🖉/TM.lib.c:70:11: note: ‘#pragma message: Creating TM type with a CVT of:_TM·CVT_ -> AU’ + 70 | #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from cc🖉/TM.lib.c:74: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> TM·AU’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +In file included from example/try_TM_1.cli.c:39: +cc🖉/TM.lib.c:200:13: note: ‘#pragma message: Including LOCAL code for:_TM·CVT_ -> AU’ + 200 | #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +gcc -o machine/try_TM_1 scratchpad/try_TM_1.cli.o -Lscratchpad -L/lib64 -L/lib -lN +gcc -Icc🖉 -include "/home/Thomas/subu_data/developer/N/tool_shared/third_party/RT-project-share/release/make/RT_0.h" -I example -o scratchpad/try_TM_2.cli.o -c example/try_TM_2.cli.c +In file included from cc🖉/TM.lib.c:27, + from example/try_TM_2.cli.c:7: +cc🖉/Binding.lib.c:29:13: note: ‘#pragma message: in #ifndef Binding_LIST section’ + 29 | #pragma message( "in #ifndef Binding_LIST section" ) + | ^~~~~~~ +In file included from example/try_TM_2.cli.c:10: +cc🖉/TM.lib.c:70:11: note: ‘#pragma message: Creating TM type with a CVT of:_TM·CVT_ -> AU’ + 70 | #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from cc🖉/TM.lib.c:74: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> TM·AU’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +In file included from example/try_TM_2.cli.c:15: +cc🖉/TM.lib.c:70:11: note: ‘#pragma message: Creating TM type with a CVT of:_TM·CVT_ -> Str’ + 70 | #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from cc🖉/TM.lib.c:74: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> TM·Str’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +In file included from example/try_TM_2.cli.c:64: +cc🖉/TM.lib.c:200:13: note: ‘#pragma message: Including LOCAL code for:_TM·CVT_ -> AU’ + 200 | #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from example/try_TM_2.cli.c:68: +cc🖉/TM.lib.c:200:13: note: ‘#pragma message: Including LOCAL code for:_TM·CVT_ -> Str’ + 200 | #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +gcc -o machine/try_TM_2 scratchpad/try_TM_2.cli.o -Lscratchpad -L/lib64 -L/lib -lN +gcc -Icc🖉 -include "/home/Thomas/subu_data/developer/N/tool_shared/third_party/RT-project-share/release/make/RT_0.h" -I example -o scratchpad/try_TM_3.cli.o -c example/try_TM_3.cli.c +In file included from cc🖉/TM.lib.c:27, + from example/try_TM_3.cli.c:7: +cc🖉/Binding.lib.c:29:13: note: ‘#pragma message: in #ifndef Binding_LIST section’ + 29 | #pragma message( "in #ifndef Binding_LIST section" ) + | ^~~~~~~ +In file included from example/try_TM_3.cli.c:11: +cc🖉/TM.lib.c:70:11: note: ‘#pragma message: Creating TM type with a CVT of:_TM·CVT_ -> AU’ + 70 | #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from cc🖉/TM.lib.c:74: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> TM·AU’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +In file included from example/try_TM_3.cli.c:16: +cc🖉/TM.lib.c:70:11: note: ‘#pragma message: Creating TM type with a CVT of:_TM·CVT_ -> Str’ + 70 | #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from cc🖉/TM.lib.c:74: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> TM·Str’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +In file included from example/try_TM_3.cli.c:22: +cc🖉/TM.lib.c:200:13: note: ‘#pragma message: Including LOCAL code for:_TM·CVT_ -> AU’ + 200 | #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from example/try_TM_3.cli.c:27: +cc🖉/TM.lib.c:200:13: note: ‘#pragma message: Including LOCAL code for:_TM·CVT_ -> Str’ + 200 | #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +gcc -o machine/try_TM_3 scratchpad/try_TM_3.cli.o -Lscratchpad -L/lib64 -L/lib -lN +gcc -Icc🖉 -include "/home/Thomas/subu_data/developer/N/tool_shared/third_party/RT-project-share/release/make/RT_0.h" -I example -o scratchpad/try_TM_4.cli.o -c example/try_TM_4.cli.c +In file included from cc🖉/TM.lib.c:27, + from example/try_TM_4.cli.c:7: +cc🖉/Binding.lib.c:29:13: note: ‘#pragma message: in #ifndef Binding_LIST section’ + 29 | #pragma message( "in #ifndef Binding_LIST section" ) + | ^~~~~~~ +In file included from example/try_TM_4.cli.c:10: +cc🖉/TM.lib.c:70:11: note: ‘#pragma message: Creating TM type with a CVT of:_TM·CVT_ -> AU’ + 70 | #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from cc🖉/TM.lib.c:74: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> TM·AU’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +In file included from example/try_TM_4.cli.c:15: +cc🖉/TM.lib.c:70:11: note: ‘#pragma message: Creating TM type with a CVT of:_TM·CVT_ -> Str’ + 70 | #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from cc🖉/TM.lib.c:74: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> TM·Str’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +In file included from example/try_TM_4.cli.c:61: +cc🖉/TM.lib.c:200:13: note: ‘#pragma message: Including LOCAL code for:_TM·CVT_ -> AU’ + 200 | #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from example/try_TM_4.cli.c:65: +cc🖉/TM.lib.c:200:13: note: ‘#pragma message: Including LOCAL code for:_TM·CVT_ -> Str’ + 200 | #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +gcc -o machine/try_TM_4 scratchpad/try_TM_4.cli.o -Lscratchpad -L/lib64 -L/lib -lN +gcc -Icc🖉 -include "/home/Thomas/subu_data/developer/N/tool_shared/third_party/RT-project-share/release/make/RT_0.h" -I example -o scratchpad/try_TM_5.cli.o -c example/try_TM_5.cli.c +In file included from cc🖉/TM.lib.c:27, + from example/try_TM_5.cli.c:8: +cc🖉/Binding.lib.c:29:13: note: ‘#pragma message: in #ifndef Binding_LIST section’ + 29 | #pragma message( "in #ifndef Binding_LIST section" ) + | ^~~~~~~ +In file included from example/try_TM_5.cli.c:11: +cc🖉/TM.lib.c:70:11: note: ‘#pragma message: Creating TM type with a CVT of:_TM·CVT_ -> AU’ + 70 | #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from cc🖉/TM.lib.c:74: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> TM·AU’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +In file included from example/try_TM_5.cli.c:65: +cc🖉/TM.lib.c:200:13: note: ‘#pragma message: Including LOCAL code for:_TM·CVT_ -> AU’ + 200 | #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +gcc -o machine/try_TM_5 scratchpad/try_TM_5.cli.o -Lscratchpad -L/lib64 -L/lib -lN +gcc -Icc🖉 -include "/home/Thomas/subu_data/developer/N/tool_shared/third_party/RT-project-share/release/make/RT_0.h" -I example -o scratchpad/try_TM_6.cli.o -c example/try_TM_6.cli.c +In file included from cc🖉/TM.lib.c:27, + from example/try_TM_6.cli.c:7: +cc🖉/Binding.lib.c:29:13: note: ‘#pragma message: in #ifndef Binding_LIST section’ + 29 | #pragma message( "in #ifndef Binding_LIST section" ) + | ^~~~~~~ +In file included from example/try_TM_6.cli.c:10: +cc🖉/TM.lib.c:70:11: note: ‘#pragma message: Creating TM type with a CVT of:_TM·CVT_ -> AU’ + 70 | #pragma message( "Creating TM type with a CVT of:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +In file included from cc🖉/TM.lib.c:74: +cc🖉/Binding.lib.c:60:11: note: ‘#pragma message: adding binding for:_BINDING_ -> TM·AU’ + 60 | #pragma message( "adding binding for:" STR_VAL(_BINDING_) ) + | ^~~~~~~ +In file included from example/try_TM_6.cli.c:46: +cc🖉/TM.lib.c:200:13: note: ‘#pragma message: Including LOCAL code for:_TM·CVT_ -> AU’ + 200 | #pragma message( "Including LOCAL code for:" STR_VAL(_TM·CVT_) ) + | ^~~~~~~ +gcc -o machine/try_TM_6 scratchpad/try_TM_6.cli.o -Lscratchpad -L/lib64 -L/lib -lN +make[1]: Leaving directory '/home/Thomas/subu_data/developer/N/developer' ++ set +x +make done. ++ set +x +make done. + +2025-04-25T04:44:15Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> ls machine +. .. bespoke .gitignore try_TM_1 try_TM_2 try_TM_3 try_TM_4 try_TM_5 try_TM_6 + +2025-04-25T04:44:51Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> ./machine/try_TM_1 +running try_TM_1.cli.c on Apr 25 2025 at 04:44:14 +01 02 03 04 05 + +2025-04-25T04:45:18Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> ./machine/try_TM_2 +running try_TM_2.cli.c on Apr 25 2025 at 04:44:14 +TM·AU tape: aa 55 c2 +TM·Str tape: "hello" "world" "Calderis" + +2025-04-25T04:45:25Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> ./machine/try_TM_3 +running try_TM_3.cli.c on Apr 25 2025 at 04:44:14 +Initial TM·AU tape: +aa 55 c2 01 +Initial TM·Str tape: +"hello" "world" "Calderis" "(null)" +After dismount/remount, AU read: aa +After step to right and left again: aa + +2025-04-25T04:45:32Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> ./machine/try_TM_4 +running try_TM_2.cli.c on Apr 25 2025 at 04:44:14 +aa + hello world Calderis +55 + hello world Calderis +c2 + hello world Calderis + + +2025-04-25T04:45:40Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> ./machine/try_TM_5 +running try_TM_5.cli.c on Apr 25 2025 at 04:44:14 +Verifying written tape: +10 11 12 13 + +2025-04-25T04:45:48Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> ./machine/try_TM_6 +running try_TM_6.cli.c on Apr 25 2025 at 04:44:15 +Initial value: 3f +After stepping, value: a5 +After remount, value: a5 + +2025-04-25T04:45:55Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer§ +> diff --git a/developer/example/try_TM_1.cli.c b/developer/example/try_TM_1.cli.c index a43e852..01d17d7 100644 --- a/developer/example/try_TM_1.cli.c +++ b/developer/example/try_TM_1.cli.c @@ -4,11 +4,11 @@ #include #include "cpp_ext.c" -#include "TM.lib.c" +#include "TM·Array.lib.c" #define _TM·CVT_ AU -#include "TM.lib.c" -#define SET__Binding__TM·AU +#include "TM·Array.lib.c" +#define SET_Binding__TM·Array·AU int main(){ printf("running try_TM_1.cli.c on %s at %s\n", __DATE__, __TIME__); @@ -36,5 +36,5 @@ int main(){ #define LOCAL #define _TM·CVT_ AU -#include "TM.lib.c" -#define SET__TM·LOCAL__TM·AU +#include "TM·Array.lib.c" +#define SET_TM·Array·LOCAL__TM·AU diff --git a/developer/example/try_TM_2.cli.c b/developer/example/try_TM_2.cli.c index b315402..499d28e 100644 --- a/developer/example/try_TM_2.cli.c +++ b/developer/example/try_TM_2.cli.c @@ -8,12 +8,12 @@ #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__Binding__TM·AU +#define SET_Binding__TM·AU typedef char* Str; #define _TM·CVT_ Str #include "TM.lib.c" -#define SET__Binding__TM·Str +#define SET_Binding__TM·Str int main(){ printf("running try_TM_2.cli.c on %s at %s\n", __DATE__, __TIME__); @@ -62,9 +62,9 @@ int main(){ #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__TM·LOCAL__TM·AU +#define SET_TM·LOCAL__TM·AU #define _TM·CVT_ Str #include "TM.lib.c" -#define SET__TM·LOCAL__TM·Str +#define SET_TM·LOCAL__TM·Str diff --git a/developer/example/try_TM_3.cli.c b/developer/example/try_TM_3.cli.c index 496f6d5..9fc8143 100644 --- a/developer/example/try_TM_3.cli.c +++ b/developer/example/try_TM_3.cli.c @@ -9,23 +9,23 @@ // Include the same type twice (should be gate-guarded) #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__Binding__TM·AU +#define SET_Binding__TM·AU #define _TM·CVT_ Str typedef char* Str; #include "TM.lib.c" -#define SET__Binding__TM·Str +#define SET_Binding__TM·Str // Include LOCAL twice as well #define LOCAL #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__TM·LOCAL__TM·AU +#define SET_TM·LOCAL__TM·AU #define LOCAL #define _TM·CVT_ Str #include "TM.lib.c" -#define SET__TM·LOCAL__TM·Str +#define SET_TM·LOCAL__TM·Str int main(){ printf("running try_TM_3.cli.c on %s at %s\n", __DATE__, __TIME__); diff --git a/developer/example/try_TM_4.cli.c b/developer/example/try_TM_4.cli.c index 75327f1..b86ddbf 100644 --- a/developer/example/try_TM_4.cli.c +++ b/developer/example/try_TM_4.cli.c @@ -1,5 +1,5 @@ /* - try_TM_2.cli.c - Demonstrates two coexisting TM types: TM·AU and TM·str. + try_TM_4.cli.c - Demonstrates two coexisting TM types: TM·AU and TM·str. */ #include @@ -8,12 +8,12 @@ #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__Binding__TM·AU +#define SET_Binding__TM·AU typedef char* Str; #define _TM·CVT_ Str #include "TM.lib.c" -#define SET__Binding__TM·Str +#define SET_Binding__TM·Str int main(){ printf("running try_TM_2.cli.c on %s at %s\n", __DATE__, __TIME__); @@ -59,9 +59,9 @@ int main(){ #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__TM·LOCAL__TM·AU +#define SET_TM·LOCAL__TM·AU #define _TM·CVT_ Str #include "TM.lib.c" -#define SET__TM·LOCAL__TM·Str +#define SET_TM·LOCAL__TM·Str diff --git a/developer/example/try_TM_5.cli.c b/developer/example/try_TM_5.cli.c index e5494a3..4c814e3 100644 --- a/developer/example/try_TM_5.cli.c +++ b/developer/example/try_TM_5.cli.c @@ -9,7 +9,7 @@ #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__Binding__TM·AU +#define SET_Binding__TM·AU int main(){ printf("running try_TM_5.cli.c on %s at %s\n", __DATE__, __TIME__); @@ -63,4 +63,4 @@ int main(){ #define LOCAL #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__TM·LOCAL__TM·AU +#define SET_TM·LOCAL__TM·AU diff --git a/developer/example/try_TM_6.cli.c b/developer/example/try_TM_6.cli.c index 519a1e2..2d785ae 100644 --- a/developer/example/try_TM_6.cli.c +++ b/developer/example/try_TM_6.cli.c @@ -8,7 +8,7 @@ #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__Binding__TM·AU +#define SET_Binding__TM·AU int main(){ @@ -44,4 +44,4 @@ int main(){ #define LOCAL #define _TM·CVT_ AU #include "TM.lib.c" -#define SET__TM·LOCAL__TM·AU +#define SET_TM·LOCAL__TM·AU diff --git a/developer/example_cpp/example_A.transcript b/developer/example_cpp/example_A.transcript new file mode 100644 index 0000000..8481a32 --- /dev/null +++ b/developer/example_cpp/example_A.transcript @@ -0,0 +1,19 @@ +2025-04-25T04:26:16Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> gcc example_A.c + +2025-04-25T04:28:46Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> ./a.out + I like the number 123 + A (123) +A (123) --> I like the number 123 +A NULL_FN() (123) --> A (123) + + I like the number 123 +EVAL1(A NULL_FN() (123)) --> I like the number 123 + + +2025-04-25T04:28:50Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> \ No newline at end of file diff --git a/developer/example_cpp/example_eval.c b/developer/example_cpp/example_eval.c index e60af83..c12a4d9 100644 --- a/developer/example_cpp/example_eval.c +++ b/developer/example_cpp/example_eval.c @@ -11,19 +11,6 @@ int main(void){ SHOW(NOT_SO_FAST(5)); #define BE(x) x - SHOW(BE(NOT_SO_FAST(5))) + SHOW(BE(NOT_SO_FAST(5))); } -/* - 2025-03-27T04:47:02Z[developer] - Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example§ - > gcc example_eval.c - - 2025-03-27T04:47:32Z[developer] - Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example§ - > ./a.out - example_eval.c - NOT_SO_FAST(5) → NEGATE (5) - BE(NOT_SO_FAST(5)) → -5 - -*/ diff --git a/developer/example_cpp/example_eval.transcript b/developer/example_cpp/example_eval.transcript new file mode 100644 index 0000000..438642f --- /dev/null +++ b/developer/example_cpp/example_eval.transcript @@ -0,0 +1,10 @@ +2025-03-27T04:47:02Z[developer] +Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example§ +> gcc example_eval.c + +2025-03-27T04:47:32Z[developer] +Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example§ +> ./a.out +example_eval.c +NOT_SO_FAST(5) → NEGATE (5) +BE(NOT_SO_FAST(5)) → -5 diff --git a/developer/example_cpp/example_grow.c b/developer/example_cpp/example_grow.c index 74f3cca..73a76ba 100644 --- a/developer/example_cpp/example_grow.c +++ b/developer/example_cpp/example_grow.c @@ -90,32 +90,3 @@ int main(void){ // BE(RESULT2) --> 1029 * GROW6 (151) } -/* - 2025-03-27T10:45:39Z[developer] -Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example§ -> gcc example_grow.c - -2025-03-27T11:43:19Z[developer] -Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example§ -> ./a.out -example_grow.c - -GROW(7) --> 17 * GROW(7) -GROW(GROW(5)) --> 17 * GROW(17 * GROW(5)) - -GROW2(11) --> 19 * GROW2 (11) - -GROW3(13) --> 119 * 19 * GROW2 (13) - -GROW4(15) --> 123 * GROW4 (15) - -BE(GROW5(21)) --> 541 * 541 * CONFEDERATE () (21) -BE(BE(GROW5(57))) --> 541 * 541 * 541 * CONFEDERATE () (57) - -RESULT1 --> 1029 * GROW6 (51) -BE(RESULT1) --> 1029 * GROW6 (51) - -RESULT2 --> 1029 * GROW6 (151) -BE(RESULT2) --> 1029 * GROW6 (151) - -*/ diff --git a/developer/example_cpp/example_grow.transcript b/developer/example_cpp/example_grow.transcript new file mode 100644 index 0000000..945181c --- /dev/null +++ b/developer/example_cpp/example_grow.transcript @@ -0,0 +1,26 @@ +2025-03-27T10:45:39Z[developer] +Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example§ +> gcc example_grow.c + +2025-03-27T11:43:19Z[developer] +Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example§ +> ./a.out +example_grow.c + +GROW(7) --> 17 * GROW(7) +GROW(GROW(5)) --> 17 * GROW(17 * GROW(5)) + +GROW2(11) --> 19 * GROW2 (11) + +GROW3(13) --> 119 * 19 * GROW2 (13) + +GROW4(15) --> 123 * GROW4 (15) + +BE(GROW5(21)) --> 541 * 541 * CONFEDERATE () (21) +BE(BE(GROW5(57))) --> 541 * 541 * 541 * CONFEDERATE () (57) + +RESULT1 --> 1029 * GROW6 (51) +BE(RESULT1) --> 1029 * GROW6 (51) + +RESULT2 --> 1029 * GROW6 (151) +BE(RESULT2) --> 1029 * GROW6 (151) diff --git a/developer/example_cpp/example_grow2.transcript b/developer/example_cpp/example_grow2.transcript new file mode 100644 index 0000000..d675bad --- /dev/null +++ b/developer/example_cpp/example_grow2.transcript @@ -0,0 +1,16 @@ +2025-04-25T04:31:47Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> gcc example_grow2.c + +2025-04-25T04:32:50Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> ./a.out +One-trampoline minimal example: + +GROW(7) --> 19 * _GROW ()(7) +BE(GROW(7)) --> 19 * 19 * _GROW ()(7) +BE(BE(GROW(7))) --> 19 * 19 * 19 * _GROW ()(7) + +2025-04-25T04:32:53Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> \ No newline at end of file diff --git a/developer/example_cpp/example_recurse.transcript b/developer/example_cpp/example_recurse.transcript new file mode 100644 index 0000000..5aae4f4 --- /dev/null +++ b/developer/example_cpp/example_recurse.transcript @@ -0,0 +1,27 @@ +2025-04-25T04:32:53Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> gcc example_recurse.c + +2025-04-25T04:33:40Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> ./a.out +No EVAL: + RECURSE() +RECURSE() --> I am recursive, look: _RECURSE ()() + +With EVAL1: + EVAL1(RECURSE()) +EVAL1(RECURSE()) --> I am recursive, look: I am recursive, look: _RECURSE ()() + +With EVAL2: + EVAL2(RECURSE()) +EVAL2(RECURSE()) --> I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: _RECURSE ()() + +With EVAL32: + EVAL32(RECURSE()) +EVAL32(RECURSE()) --> I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: I am recursive, look: _RECURSE ()() + + +2025-04-25T04:33:43Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> \ No newline at end of file diff --git a/developer/example_cpp/try_ext_0.transcript b/developer/example_cpp/try_ext_0.transcript new file mode 100644 index 0000000..3dc632e --- /dev/null +++ b/developer/example_cpp/try_ext_0.transcript @@ -0,0 +1,75 @@ +2025-04-25T04:18:38Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> gcc try_ext_0.c + +2025-04-25T04:24:48Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> ./a.out +_FIRST(1) -> 1 +_FIRST() -> +_SECOND(1,2) -> 2 +_SECOND(1,) -> + +RETURN_NOTHING() -> + +_OR() -> +_OR(1) -> RETURN_NOTHING 1 () +_OR(1,2,3) -> RETURN_NOTHING 1 + +T(x) -> 7 +_NOT_ITEM() -> _NOT_ITEM() +_NOT_ITEM(1) -> _NOT_ITEM(1) +_NOT_ITEM(T(x)) -> _NOT_ITEM(7) + +NOT() -> 1 +NOT(1) -> +NOT(T(x)) -> +NOT(1,2,3) -> + +BOOL() -> BOOL() +CAT2(_IF_ ,BOOL()) -> _IF_BOOL() + +TO_1_OR_0() -> TO_1_OR_0() +TO_1_OR_0(1) -> TO_1_OR_0(1) +TO_1_OR_0(x) -> TO_1_OR_0(x) +TO_1_OR_0(1.2.3) -> TO_1_OR_0(1.2.3) + +EXISTS() -> +EXISTS(0) -> 1 +EXISTS(x,y,z) -> 1 + +LEQ2( , ) -> 1 +LEQ2( , 1 ) -> +LEQ2( 1, ) -> +LEQ2( 1, 0 ) -> 0 + +XOR2( , ) -> +XOR2( , 0 ) -> 0 +XOR2( 0, 0 ) -> + +AND2( , 0 ) -> +AND2( 0, 1 ) -> 1 + +OR2( , ) -> +OR2( , 0 ) -> 0 + +EQ(APPLE ,APPLE) -> 1 +EQ(APPLE ,PEAR) -> +EQ(PEAR ,PEAR) -> 1 +EQ(,) -> 1 +EQ(,PEAR) -> +EQ(PEAR ,) -> + +BOOLEAN() -> 0 +BOOLEAN(0) -> 1 +BOOLEAN(foo) -> 1 +BOOLEAN(1,2,3) -> 1 + +REST() -> +REST(1) -> +REST(1,2) -> 2 +REST(1,2,3) -> 2,3 + +2025-04-25T04:24:52Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> \ No newline at end of file diff --git a/developer/example_cpp/try_ext_1.c b/developer/example_cpp/try_ext_1.c index b0b5eaa..7b64c46 100644 --- a/developer/example_cpp/try_ext_1.c +++ b/developer/example_cpp/try_ext_1.c @@ -103,50 +103,4 @@ int main(void){ printf("\n"); } -/* - 2025-04-01T04:44:40Z[developer] - Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example_cpp§ - > gcc try_ext_1.c - 2025-04-01T04:44:44Z[developer] - Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example_cpp§ - > ./a.out - EVAL(EXAMPLE_CHAIN(3)) -> 3 + 1 + 1 - - FIND(IS_X ,A ,B ,X ,Y ,Z) -> X - FIND(IS_X ,A ,B ,C ,D) -> EOL() - - EQ(A ,B) -> - EQ(B ,B) -> 1 - - CONTAINS(C ,A ,B ,C ,D) -> 1 - CONTAINS(Z ,A ,B ,C ,D) -> - - WHILE(NON_Z ,A ,B ,C ,Z ,D ,E) -> - WHILE(NON_Z ,A ,B ,C) -> 1 - - EXISTS() -> - EXISTS(0) -> 1 - EXISTS(1) -> 1 - EXISTS(X) -> 1 - WHILE(EXISTS ,1 ,X , ) -> - WHILE(EXISTS ,1 , ,X ,0) -> - WHILE(EXISTS ,1 ,X ,0) -> 1 - - LAST(A ,B ,C ,D ,Z) -> Z - LAST(A ,B ,) -> - LAST() -> - - CAT(__oo__,A ,B ,C) -> A__oo__B__oo__C - CAT(,A ,B ,C) -> ABC - CAT(,A ,B ,) -> AB - CAT(,1) -> 1 - CAT(,) -> - - AND(1 ,X ,0) -> 1 - AND(1 ,X ,) -> - - OR( , , ,X) -> 1 - OR( , , ,) -> - -*/ diff --git a/developer/example_cpp/try_ext_1.transcript b/developer/example_cpp/try_ext_1.transcript new file mode 100644 index 0000000..a23bf12 --- /dev/null +++ b/developer/example_cpp/try_ext_1.transcript @@ -0,0 +1,97 @@ + 2025-04-01T04:44:40Z[developer] + Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example_cpp§ + > gcc try_ext_1.c + + 2025-04-01T04:44:44Z[developer] + Thomas-developer@Stanley§/home/Thomas-masu/developer/N/developer/example_cpp§ + > ./a.out + EVAL(EXAMPLE_CHAIN(3)) -> 3 + 1 + 1 + + FIND(IS_X ,A ,B ,X ,Y ,Z) -> X + FIND(IS_X ,A ,B ,C ,D) -> EOL() + + EQ(A ,B) -> + EQ(B ,B) -> 1 + + CONTAINS(C ,A ,B ,C ,D) -> 1 + CONTAINS(Z ,A ,B ,C ,D) -> + + WHILE(NON_Z ,A ,B ,C ,Z ,D ,E) -> + WHILE(NON_Z ,A ,B ,C) -> 1 + + EXISTS() -> + EXISTS(0) -> 1 + EXISTS(1) -> 1 + EXISTS(X) -> 1 + WHILE(EXISTS ,1 ,X , ) -> + WHILE(EXISTS ,1 , ,X ,0) -> + WHILE(EXISTS ,1 ,X ,0) -> 1 + + LAST(A ,B ,C ,D ,Z) -> Z + LAST(A ,B ,) -> + LAST() -> + + CAT(__oo__,A ,B ,C) -> A__oo__B__oo__C + CAT(,A ,B ,C) -> ABC + CAT(,A ,B ,) -> AB + CAT(,1) -> 1 + CAT(,) -> + + AND(1 ,X ,0) -> 1 + AND(1 ,X ,) -> + + OR( , , ,X) -> 1 + OR( , , ,) -> + +-------------------------------------------------------------------------------- + + +2025-04-25T04:18:18Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> gcc try_ext_1.c + +2025-04-25T04:18:34Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> ./a.out +EVAL(EXAMPLE_CHAIN(3)) -> 3 + 1 + 1 + +FIND(IS_X ,A ,B ,X ,Y ,Z) -> X +FIND(IS_X ,A ,B ,C ,D) -> EOL() + +EQ(A ,B) -> +EQ(B ,B) -> 1 + +CONTAINS(C ,A ,B ,C ,D) -> 1 +CONTAINS(Z ,A ,B ,C ,D) -> + +WHILE(NON_Z ,A ,B ,C ,Z ,D ,E) -> +WHILE(NON_Z ,A ,B ,C) -> 1 + +EXISTS() -> +EXISTS(0) -> 1 +EXISTS(1) -> 1 +EXISTS(X) -> 1 +WHILE(EXISTS ,1 ,X , ) -> +WHILE(EXISTS ,1 , ,X ,0) -> +WHILE(EXISTS ,1 ,X ,0) -> 1 + +LAST(A ,B ,C ,D ,Z) -> Z +LAST(A ,B ,) -> +LAST() -> + +CAT(__oo__,A ,B ,C) -> A__oo__B__oo__C +CAT(,A ,B ,C) -> ABC +CAT(,A ,B ,) -> AB +CAT(,1) -> 1 +CAT(,) -> + +AND(1 ,X ,0) -> 1 +AND(1 ,X ,) -> + +OR( , , ,X) -> 1 +OR( , , ,) -> + + +2025-04-25T04:18:38Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/example_cpp§ +> \ No newline at end of file diff --git a/developer/experiment/letter_all.c b/developer/experiment/letter_all.c new file mode 100644 index 0000000..4693878 --- /dev/null +++ b/developer/experiment/letter_all.c @@ -0,0 +1,175 @@ +#include +#include +#include +#include + +int is_identifier_start(uint32_t cp) { + if (cp >= 0xD800 && cp <= 0xDFFF) return 0; // Surrogate halves + if ((cp & 0xFFFF) == 0xFFFF || (cp & 0xFFFF) == 0xFFFE) return 0; // Noncharacters + + // ASCII letters and underscore + if ((cp >= 'A' && cp <= 'Z') || + (cp >= 'a' && cp <= 'z') || + cp == '_') return 1; + + // Latin-1 Supplement + if ((cp >= 0x00C0 && cp <= 0x00D6) || + (cp >= 0x00D8 && cp <= 0x00F6) || + (cp >= 0x00F8 && cp <= 0x00FF)) return 1; + + // Latin Extended-A and B + if ((cp >= 0x0100 && cp <= 0x017F) || + (cp >= 0x0180 && cp <= 0x024F)) return 1; + + // IPA Extensions, Spacing Modifier Letters + if ((cp >= 0x0250 && cp <= 0x02AF) || + (cp >= 0x02B0 && cp <= 0x02FF)) return 1; + + // Greek and Coptic + if (cp >= 0x0370 && cp <= 0x03FF) return 1; + + // Cyrillic + if ((cp >= 0x0400 && cp <= 0x04FF) || + (cp >= 0x0500 && cp <= 0x052F)) return 1; + + // Armenian + if (cp >= 0x0531 && cp <= 0x0556) return 1; + + // Hebrew + if (cp >= 0x05D0 && cp <= 0x05EA) return 1; + + // Arabic + if ((cp >= 0x0620 && cp <= 0x063F) || + (cp >= 0x0641 && cp <= 0x064A)) return 1; + + // Syriac + if (cp >= 0x0710 && cp <= 0x072F) return 1; + + // Thaana + if (cp >= 0x0780 && cp <= 0x07BF) return 1; + + // Devanagari + if (cp >= 0x0900 && cp <= 0x097F) return 1; + + // Bengali + if (cp >= 0x0980 && cp <= 0x09FF) return 1; + + // Gurmukhi + if (cp >= 0x0A00 && cp <= 0x0A7F) return 1; + + // Gujarati + if (cp >= 0x0A80 && cp <= 0x0AFF) return 1; + + // Oriya + if (cp >= 0x0B00 && cp <= 0x0B7F) return 1; + + // Tamil + if (cp >= 0x0B80 && cp <= 0x0BFF) return 1; + + // Telugu + if (cp >= 0x0C00 && cp <= 0x0C7F) return 1; + + // Kannada + if (cp >= 0x0C80 && cp <= 0x0CFF) return 1; + + // Malayalam + if (cp >= 0x0D00 && cp <= 0x0D7F) return 1; + + // Sinhala + if (cp >= 0x0D80 && cp <= 0x0DFF) return 1; + + // Thai + if (cp >= 0x0E00 && cp <= 0x0E7F) return 1; + + // Lao + if (cp >= 0x0E80 && cp <= 0x0EFF) return 1; + + // Tibetan + if (cp >= 0x0F00 && cp <= 0x0FBF) return 1; + + // Myanmar + if (cp >= 0x1000 && cp <= 0x109F) return 1; + + // Georgian + if ((cp >= 0x10A0 && cp <= 0x10FF) || (cp >= 0x2D00 && cp <= 0x2D2F)) return 1; + + // Hangul Jamo + if (cp >= 0x1100 && cp <= 0x11FF) return 1; + + // Ethiopic + if (cp >= 0x1200 && cp <= 0x137F) return 1; + + // Cherokee + if (cp >= 0x13A0 && cp <= 0x13FF) return 1; + + // Unified Canadian Aboriginal Syllabics + if (cp >= 0x1400 && cp <= 0x167F) return 1; + + // Ogham + if (cp >= 0x1680 && cp <= 0x169F) return 1; + + // Runic + if (cp >= 0x16A0 && cp <= 0x16FF) return 1; + + // Khmer + if (cp >= 0x1780 && cp <= 0x17FF) return 1; + + // Mongolian + if (cp >= 0x1800 && cp <= 0x18AF) return 1; + + // Limbu + if (cp >= 0x1900 && cp <= 0x194F) return 1; + + // Tai Le + if (cp >= 0x1950 && cp <= 0x197F) return 1; + + // New Tai Lue + if (cp >= 0x1980 && cp <= 0x19DF) return 1; + + // Bopomofo + if ((cp >= 0x3100 && cp <= 0x312F) || + (cp >= 0x31A0 && cp <= 0x31BF)) return 1; + + // CJK Unified Ideographs (Chinese, Japanese, Korean) + if ((cp >= 0x4E00 && cp <= 0x9FFF) || + (cp >= 0x3400 && cp <= 0x4DBF) || // Extension A + (cp >= 0x20000 && cp <= 0x2A6DF) || // Extension B + (cp >= 0x2A700 && cp <= 0x2B73F) || // Extension C + (cp >= 0x2B740 && cp <= 0x2B81F) || // Extension D + (cp >= 0x2B820 && cp <= 0x2CEAF) || // Extension E + (cp >= 0x2CEB0 && cp <= 0x2EBEF)) // Extension F + return 1; + + // Hiragana, Katakana (Japanese) + if ((cp >= 0x3040 && cp <= 0x309F) || (cp >= 0x30A0 && cp <= 0x30FF)) return 1; + + // Yi Syllables + if (cp >= 0xA000 && cp <= 0xA48F) return 1; + + // Letter Numbers (like Roman numerals) + if (cp >= 0x2160 && cp <= 0x2188) return 1; + + // Modifier letters + if ((cp >= 0x02B0 && cp <= 0x02FF)) return 1; + + return 0; +} + +int main(void) { + setlocale(LC_ALL, ""); + + for (uint32_t cp = 0; cp <= 0x10FFFF; ++cp) { + if (is_identifier_start(cp)) { + if (cp <= 0xFFFF) { + wprintf(L"%lc", (wchar_t)cp); + } else { + // Output surrogate pairs if necessary + uint32_t high = ((cp - 0x10000) >> 10) + 0xD800; + uint32_t low = ((cp - 0x10000) & 0x3FF) + 0xDC00; + wprintf(L"%lc%lc", (wchar_t)high, (wchar_t)low); + } + } + } + + return 0; +} diff --git a/developer/experiment/try_letters_2.c b/developer/experiment/letter_delta.c similarity index 100% rename from developer/experiment/try_letters_2.c rename to developer/experiment/letter_delta.c diff --git a/developer/experiment/letter_lm_rm_1.c b/developer/experiment/letter_lm_rm_1.c new file mode 100644 index 0000000..11caebf --- /dev/null +++ b/developer/experiment/letter_lm_rm_1.c @@ -0,0 +1,11 @@ +#include + +//#define Ttype int +#define ▷type int + +int main() { + ▷type x = 1000; + + printf("x: %x %y" ,x); + return 0; +} diff --git a/developer/experiment/letter_lm_rm_2.c b/developer/experiment/letter_lm_rm_2.c new file mode 100644 index 0000000..8f6b018 --- /dev/null +++ b/developer/experiment/letter_lm_rm_2.c @@ -0,0 +1,14 @@ +#include + +//#define Ttype int +//#define ⊏type int +//#define ⊐type int + +int main() { + // ⊏type x = 1000; + // ⊐type y = 2000; + + int ⊏x = 5; + printf("x: %x %y" ,x); + return 0; +} diff --git a/developer/experiment/letter_lm_rm_3.c b/developer/experiment/letter_lm_rm_3.c new file mode 100644 index 0000000..5c05290 --- /dev/null +++ b/developer/experiment/letter_lm_rm_3.c @@ -0,0 +1,21 @@ +#include + +int main() { + int xコ = 5; + int ㄈx = 7; + printf("x: %x %x" ,xコ ,ㄈx); + return 0; +} + +/* +2025-04-25T11:25:54Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> ./a.out +x: 5 7 +*/ + +/* +Identifier Character(s) Unicode Category Allowed? Font visible? +xコ Katakana KO Lo (Letter, Other) ✅ Yes If font supports Katakana +ㄈx Bopomofo FA Lo (Letter, Other) ✅ Yes Often not visible unless font supports Zhuyin +*/ diff --git a/developer/experiment/letter_lm_rm_4.c b/developer/experiment/letter_lm_rm_4.c new file mode 100644 index 0000000..69b1062 --- /dev/null +++ b/developer/experiment/letter_lm_rm_4.c @@ -0,0 +1,18 @@ +#include + +int main() { + int xƆ = 15; + int Cx = 17; + printf("x: %x %x" ,xƆ ,Cx); + return 0; +} + +/* +2025-04-25T11:29:39Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> ./a.out +x: f 11 +2025-04-25T11:29:41Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> +*/ diff --git a/developer/experiment/letter_minus.c b/developer/experiment/letter_minus.c new file mode 100644 index 0000000..f2cf210 --- /dev/null +++ b/developer/experiment/letter_minus.c @@ -0,0 +1,17 @@ +#include + +int main() { + int ˗x = 23; + printf("x: %x %x" ,˗x); + return 0; +} + +/* +2025-04-25T14:49:07Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> ./a.out +x: 17 bfeedf08 +2025-04-25T14:49:09Z[developer] +Thomas-developer@StanleyPark§/home/Thomas/subu_data/developer/N/developer/experiment§ +> +*/ diff --git a/developer/experiment/try_letters.c b/developer/experiment/letter_mu.c similarity index 100% rename from developer/experiment/try_letters.c rename to developer/experiment/letter_mu.c diff --git a/developer/experiment/try_letters_3.c b/developer/experiment/letter_theta.c similarity index 100% rename from developer/experiment/try_letters_3.c rename to developer/experiment/letter_theta.c diff --git a/developer/experiment/temp b/developer/experiment/temp new file mode 100644 index 0000000..ca8e860 --- /dev/null +++ b/developer/experiment/temp @@ -0,0 +1,6 @@ +mv print_id_letters.c letters_legal_all.c +mv try_letter_lm_rm_2.c letter_lm_rm_1.c +mv try_letter_mu.c letter_mu.c +mv try_letters_delta.c letter_delta.c +mv try_letters_lm_rm.c letter_lm_rm_2.c +mv try_letters_theta.c letter_theta.c \ No newline at end of file diff --git "a/developer/tool\360\237\226\211/makefile" "b/developer/tool\360\237\226\211/makefile" index 41932ad..47afa2f 100644 --- "a/developer/tool\360\237\226\211/makefile" +++ "b/developer/tool\360\237\226\211/makefile" @@ -3,15 +3,11 @@ RT-INCOMMON:=$(REPO_HOME)/tool_shared/third_party/RT-project-share/release include $(RT-INCOMMON)/make/environment_RT_0 -# to compile only the example directory -# comment these out for a normal compile -# +# To compile the example directory uncomment the following assignments: SRCDIR_List=example -# -# if the .lib.c interfaces are needed: -# CFLAGS+=-Icc🖉 + CFLAGS+= -include "$(RT-INCOMMON)/make/RT_0.h" LINKFLAGS+= -l$(PROJECT) LIBFILE=$(LIBDIR)/lib$(PROJECT).a diff --git "a/document\360\237\226\211/#temp.txt#" "b/document\360\237\226\211/#temp.txt#" new file mode 100644 index 0000000..3648a70 --- /dev/null +++ "b/document\360\237\226\211/#temp.txt#" @@ -0,0 +1,93 @@ +#+TITLE: TM Bulk Methods Using Area and Extent +#+AUTHOR: Sorein +#+DATE: 2025-04-25 + +* 1. Motivation: Copying Over Areas, Not Just Cells + +In TTCA, a **cell** is the basic unit of memory or tape, and a **Tape Machine (TM)** traverses such cells with a movable head. + +For high-throughput operations like `Copy`, operating on one cell at a time is inefficient. Instead, we want to operate over an **area**: a concrete, contiguous **sequence of cells**, defined by: + +- A **starting address** (typically the current head position) +- An **extent** — the **inclusive upper bound** of the area + +This gives the TM enough structure to reason about **bulk memory access** safely and efficiently. + +TTCA terminology distinguishes: +- **Area**: A sequence of cells between a starting point and an extent. +- **Extent**: The highest address within that area. +- **Distance**: The difference between the head and the extent (extent − head), used internally but not exposed as API input. + +We avoid using “length” as it is ambiguous and may overflow (`distance + 1`). + +* 2. Proposed TM Methods for Bulk Area Access + +Each TM instantiated over a Cell Value Type (CVT) can optionally support the following methods: + +#+BEGIN_SRC c +bool TM·AU·can_area(TM·AU tm ,uintptr_t extent); +AU const* TM·AU·peek_area(TM·AU tm ,uintptr_t extent); +AU* TM·AU·claim_area(TM·AU tm ,uintptr_t extent); +void TM·AU·commit_area(TM·AU tm ,uintptr_t extent); +uintptr_t TM·AU·extent_right(TM·AU tm); +#+END_SRC + +* 3. Method Semantics + +| Method | Meaning | +|-------------------------+-------------------------------------------------------------------------| +| `can_area(extent)` | True if the tape has a contiguous area from head up to this extent | +| `peek_area(extent)` | Returns a const pointer to the area [head … extent], or NULL | +| `claim_area(extent)` | Returns a writable pointer to the area [head … extent], or NULL | +| `commit_area(extent)` | Advances the head from current position to `extent` (inclusive) | +| `extent_right()` | Returns the extent (inclusive upper bound) of the tape | + +All returned areas are assumed to be **concrete**—that is, the TM guarantees: +- All cells in the area are physically allocated +- Their memory layout is contiguous +- They can be safely accessed as an array of CVT values + +If these conditions are not met (e.g. for cyclic or segmented tapes), the TM returns `false` or `NULL`. + +* 4. Area-Based Copy Example + +Using these methods, an efficient `Copy` routine becomes: + +#+BEGIN_SRC c +while( TM·AU·can_area(src ,e) && TM·AU·can_area(dst ,e) ){ + AU const* from = TM·AU·peek_area(src ,e); + AU* to = TM·AU·claim_area(dst ,e); + uintptr_t count = e - src_index + 1; + memcpy(to ,from ,count * sizeof(AU)); + TM·AU·commit_area(src ,e); + TM·AU·commit_area(dst ,e); +} +#+END_SRC + +Note: +- `e` is the intended extent (inclusive). +- `count = extent − head + 1` is used internally, but not exposed as "length". + +* 5. Capability Declaration + +Not all TMs support contiguous areas. To indicate whether a TM supports these methods, we may define: + +#+BEGIN_SRC c +typedef enum{ + TM·Caps·none = 0, + TM·Caps·area = 1 << 0 +} TM·Caps; +#+END_SRC + +This allows dispatchers to check if area-based methods are available for a given tape. + +* 6. Summary + +- We operate on **areas**, defined as `[head … extent]`, where `extent` is inclusive. +- We avoid using "length" in API design, since it implies `distance + 1`, which may overflow. +- **Area methods** allow batch reading or writing with fewer dispatches and better memory performance. +- These methods align TM with TTCA's formal model, supporting structured, efficient, and correct stream operations. + +This sets the foundation for writing `Copy`, `Map`, and other stream-based transformations using TMs as high-level iterators over cell areas. + +Would you like a matching `.org` draft for the FACE section of `Copy.lib.c`, now assuming the availability of these `area` methods? diff --git "a/document\360\237\226\211/Abstracting_Type_in_C.org" "b/document\360\237\226\211/Abstracting_Type_in_C.org" index 9a50785..17b5ec9 100644 --- "a/document\360\237\226\211/Abstracting_Type_in_C.org" +++ "b/document\360\237\226\211/Abstracting_Type_in_C.org" @@ -41,9 +41,9 @@ Despite these limitations, this convention provides many of the organizational b C lacks built-in support for templates or generics, unlike C++ or modern languages like Java or Rust. However, we can implement template-like functionality using the C preprocessor. This section explains the template system used throughout this document. -** The Xi (Ξ) Macro System +** The center dot '·' Macro System -The cpp macro `Ξ` is used for putting identifiers into a namespace. Consider these variables within a namespace. +The cpp macro `·` is used for putting identifiers into a namespace. Consider these variables within a namespace. #+BEGIN_SRC c TM·x // variable x in namespace TM @@ -52,8 +52,8 @@ TM·Array·i // variable i in namespace TM·Array ,#+BEGIN_SRC c -Ξ(TM ,x) // variable x in namespace TM -Ξ(TM·Array ,i) // variable i in namespace TM·Array +·(TM ,x) // variable x in namespace TM +·(TM·Array ,i) // variable i in namespace TM·Array #+END_SRC The reason the macro is needed is that cpp will not replace a macro that is embedded in an identifier. With this macro we can do the following: @@ -61,23 +61,23 @@ The reason the macro is needed is that cpp will not replace a macro that is embe #+BEGIN_SRC c #define CVT uint32_t CVT i; // -> uint32_t i - typedef struct Ξ(TM ,CVT) // -> typedef struct TM·uint32_t + typedef struct ·(TM ,CVT) // -> typedef struct TM·uint32_t #undef CVT #define CVT string typedef string char *; CVT ch; // -> string ch; - typedef struct Ξ(TM ,CVT) // -> typedef struct TM·string + typedef struct ·(TM ,CVT) // -> typedef struct TM·string #+END_SRC This allows us to create type and function names that are specialized for specific types, while maintaining a consistent naming convention. *** Implementation Details -The Ξ macro was initially defined for two operands, as shown below, though now it will take between zero and ten operands. With zero operands it expands to nothing, with one it echos the operand with no center dots, with more than that the operands are appended with a prior center dot. +The · macro was initially defined for two operands, as shown below, though now it will take between zero and ten operands. With zero operands it expands to nothing, with one it echos the operand with no center dots, with more than that the operands are appended with a prior center dot. #+BEGIN_SRC c -#define _Ξ2(a, b) a##·##b -#define Ξ2(a, b) _Ξ2(a, b) +#define _·2(a, b) a##·##b +#define ·2(a, b) _·2(a, b) #+END_SRC ** CVT: Cell Value Type @@ -132,8 +132,8 @@ For example, the tableau for an array-based tape machine might look like: struct { CVT *hd; // Current head position CVT *position; // Base position for the tape (leftmost cell) - Ξ(extent_t, CVT) extent; // Largest index that can be used for accessing the tape -} Ξ(TM·Array, CVT); + ·(extent_t, CVT) extent; // Largest index that can be used for accessing the tape +} ·(TM·Array, CVT); #+END_SRC Notice this struct is templated on `CVT`. Suppose it were in the file `tape.lib.c`, then: @@ -178,10 +178,10 @@ When specialized for a specific cell value type (CVT), we might then have: #+BEGIN_SRC c typedef struct { TM·FG *fg; // Base function table - Ξ(extent_t, CVT) (*extent)(TM *tm); + ·(extent_t, CVT) (*extent)(TM *tm); CVT (*read)(TM *tm); void (*write)(TM *tm, CVT *remote_pt); -} Ξ(TM, CVT)·FG; +} ·(TM, CVT)·FG; #+END_SRC ** The Relationship Between Tableaux and FG Tables @@ -199,9 +199,9 @@ This pattern allows us to achieve polymorphic behavior in C while maintaining ty The template system generates several types of identifiers: -1. **Type names**: `Ξ(TM, CVT)` becomes `TM·int` when CVT is defined as `int` -2. **Function names**: `Ξ(TM·Array, CVT)·init_pe` can become `TM·Array·int·init_pe` -3. **Variable names**: `Ξ(extent_t, CVT)` can become `extent_t·int` +1. **Type names**: `·(TM, CVT)` becomes `TM·int` when CVT is defined as `int` +2. **Function names**: `·(TM·Array, CVT)·init_pe` can become `TM·Array·int·init_pe` +3. **Variable names**: `·(extent_t, CVT)` can become `extent_t·int` ** Function Given (FG) Tables @@ -212,10 +212,10 @@ The FG tables are specialized based on the CVT: #+BEGIN_SRC c typedef struct { TM·FG *fg; // Base function table - Ξ(extent_t, CVT) (*extent)(TM *tm); + ·(extent_t, CVT) (*extent)(TM *tm); CVT (*read)(TM *tm); void (*write)(TM *tm, CVT *remote_pt); -} Ξ(TM, CVT)·FG; +} ·(TM, CVT)·FG; #+END_SRC This allows for type-safe operations while maintaining a consistent interface. @@ -224,7 +224,7 @@ This allows for type-safe operations while maintaining a consistent interface. 1. **Type safety**: The compiler checks that the correct types are used with each specialized function 2. **Code reuse**: Common functionality is defined once and specialized for different types -3. **Consistent naming**: The Ξ macro ensures a consistent naming convention +3. **Consistent naming**: The · macro ensures a consistent naming convention 4. **Modularity**: Different implementations can share the same interface ** Limitations @@ -441,7 +441,7 @@ An FG table with template variabes, will expand out to one or more FG tables (wi There can be multiple instances of an FG table. Each instance will consists of pointers to functions that have the type signature specified in the FG table. However, though all instances of the FG table share the same interface, their implementations can be completely different. -Each template variable binding, and each FG table instance can have a different Tableau type as the given argument. For the Tape Machine, we give each tableau struct the name Ξ(TM·, CVT), where is the FG instance table type. For example, Ξ(TM·Array, CVT) is a struct of state variables for an Array implementation of the TM. +Each template variable binding, and each FG table instance can have a different Tableau type as the given argument. For the Tape Machine, we give each tableau struct the name ·(TM·, CVT), where is the FG instance table type. For example, ·(TM·Array, CVT) is a struct of state variables for an Array implementation of the TM. ------------------------------------------------------------------- @@ -452,36 +452,36 @@ The TM model has functions that are independent of the CVT parameter. ** One for all FG table -The "TM.lib.c" file defines an FG type called Ξ(TM, CVT)·FG. Note that CVT is a template +The "TM.lib.c" file defines an FG type called ·(TM, CVT)·FG. Note that CVT is a template parameter. Hence, giving different CVT bindings, there will be different FG tables. -For each Ξ(TM, CVT)·FG, there can be a number of Ξ(TM·, CVT)·fg instances. For -example, Ξ(TM·Array, CVT)·fg. Each of these is a parameterized table. +For each ·(TM, CVT)·FG, there can be a number of ·(TM·, CVT)·fg instances. For +example, ·(TM·Array, CVT)·fg. Each of these is a parameterized table. A user has an fg table to call functions from. This is either passed in or, more likely, found at global scope after including "TM.lib.c", and then including it again for each value of the CVT variable to be used. -For each implementation type, there is a struct defined called Ξ(TM·, CVT), +For each implementation type, there is a struct defined called ·(TM·, CVT), note the lack of further suffix. Instances of this type are said to be instances of the tape -machine. `FG` stands for `function given`, and what each said function is given is one or more arguments of the Ξ(TM·, CVT) type. +machine. `FG` stands for `function given`, and what each said function is given is one or more arguments of the ·(TM·, CVT) type. -When a user wants a tape machine, the user makes an instance of a Ξ(TM·, CVT). -This is then handed to a function called Ξ(TM·, CVT)·init(). The init function is given whatever parameters are needed for initializing the instance, and it returns a more generalized pointer of type `Ξ(TM, CVT) *`. +When a user wants a tape machine, the user makes an instance of a ·(TM·, CVT). +This is then handed to a function called ·(TM·, CVT)·init(). The init function is given whatever parameters are needed for initializing the instance, and it returns a more generalized pointer of type `·(TM, CVT) *`. -After initialization, the Ξ(TM·, CVT) instance will have a first field value that points to the Ξ(TM·, CVT)·fg table. However, the pointer to this instance will be of the type returned by init, which is `Ξ(TM, CVT) *` (notice it lost the implementation). This more generic pointer can now be used with the generic instance of the -Ξ(TM, CVT)·FG table, Ξ(TM, CVT)·fg, which holds wrapper functions that make use of the +After initialization, the ·(TM·, CVT) instance will have a first field value that points to the ·(TM·, CVT)·fg table. However, the pointer to this instance will be of the type returned by init, which is `·(TM, CVT) *` (notice it lost the implementation). This more generic pointer can now be used with the generic instance of the +·(TM, CVT)·FG table, ·(TM, CVT)·fg, which holds wrapper functions that make use of the first field value to find the real fg table and to call those functions. Hence, after the user calls the correct init for the specific instance made, the resulting pointer points to the same type object independent of the implementation of the functions. Thus, code written to manipulate TMs can be written in a manner that is agnostic to the implementation of those TMs. -When a function is called, say Ξ(TM, CVT)·fg.step(tm), it is passed the generic type `Ξ(TM, CVT) *`, tm. This will call the step wrapper function, which will in turn pass the same arguments (in this case, only `tm`) to the step function found in the fg table pointed to by the first member of the tm struct. +When a function is called, say ·(TM, CVT)·fg.step(tm), it is passed the generic type `·(TM, CVT) *`, tm. This will call the step wrapper function, which will in turn pass the same arguments (in this case, only `tm`) to the step function found in the fg table pointed to by the first member of the tm struct. ** Separate FG tables -In the flat fg table approach described in the prior section, each wrapper function table of the form Ξ(TM, CVT)·fg, obtained by setting the CVT template to a type value, will have a full set of wrapper function pointers. When a wrapper function is the same independent of the CVT variable, it still has a pointer copied into each fg table. Thus, there will be a lot of redundancy in the tables if many functions are not CVT-specific. +In the flat fg table approach described in the prior section, each wrapper function table of the form ·(TM, CVT)·fg, obtained by setting the CVT template to a type value, will have a full set of wrapper function pointers. When a wrapper function is the same independent of the CVT variable, it still has a pointer copied into each fg table. Thus, there will be a lot of redundancy in the tables if many functions are not CVT-specific. -For the layered fg table, there are separate wrapper function tables for the wrappers that are independent of CVT and those that are CVT-differentiated. The user then calls functions from the CVT-independent table when invoking those functions and from the CVT-differentiated functions table when calling those. So, for example, the user would call TM·fg.step(tm) to do a step, as that is CVT-independent, but call Ξ(TM, CVT)·fg.read(tm) to do a read, as the read value is CVT-differentiated. +For the layered fg table, there are separate wrapper function tables for the wrappers that are independent of CVT and those that are CVT-differentiated. The user then calls functions from the CVT-independent table when invoking those functions and from the CVT-differentiated functions table when calling those. So, for example, the user would call TM·fg.step(tm) to do a step, as that is CVT-independent, but call ·(TM, CVT)·fg.read(tm) to do a read, as the read value is CVT-differentiated. ** Direct access through instance field (Orrin suggestion) @@ -491,7 +491,7 @@ Instead of calling fg functions through a globally visible table such as: fg->step(tm); // Wrapper style #+END_SRC -where fg is of type Ξ(TM, CVT)·FG and calls to it require globally accessible wrapper functions, +where fg is of type ·(TM, CVT)·FG and calls to it require globally accessible wrapper functions, we can use the instance's first field directly: @@ -499,7 +499,7 @@ we can use the instance's first field directly: tm->fg->step(tm); #+END_SRC -Here, tm is a Ξ(TM, CVT) * — the generic type returned by init — and fg is the first field of the instance pointing to the correct FG table. +Here, tm is a ·(TM, CVT) * — the generic type returned by init — and fg is the first field of the instance pointing to the correct FG table. This style removes the need for wrapper functions entirely. Each TM implementation embeds its corresponding FG table pointer directly in the instance. Thus, no global wrapper needs to be referenced, and function type-checking is preserved at compile time. diff --git "a/document\360\237\226\211/Abstracting_Type_in_C.pdf" "b/document\360\237\226\211/Abstracting_Type_in_C.pdf" deleted file mode 100644 index ce5ac69d7dc026f3c646ca842baa531d1443c97a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211829 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 z 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 TM·CVT -Ξ(TM·Array, CVT)·init -> TM·Array·CVT·init -``` - -This allows us to create type and function names that are specialized for specific types, while maintaining a consistent naming convention. - -\subsubsection{Implementation Details} -\label{sec:org08d9fe2} - -The Ξ macro system is implemented using variadic macros and the C preprocessor's token concatenation operator (\#\#): - -```c -\#define \_Ξ2(a, b) a\#\#·\#\#b -\#define Ξ2(a, b) \_Ξ2(a, b) -``` - -The system includes macros for different numbers of arguments (Ξ0 through Ξ10) and uses argument counting to automatically select the appropriate macro: - -```c -\#define Ξ(\ldots{}) Ξ\textsubscript{EXPAND}(COUNT\textsubscript{ARGS}(\uline{\uline{VA\textsubscript{ARGS}}}), \uline{\uline{VA\textsubscript{ARGS}}}) -``` - -This allows for flexible usage with different numbers of template parameters. - -\subsection{CVT: Cell Value Type} -\label{sec:org8359158} - -Throughout our tape machine implementation, we use CVT (Cell Value Type) as a template parameter. This represents the type of data stored in each cell of the tape. - -The implementation uses conditional compilation to handle different CVT values: - -```c -\#ifndef CVT - // Code for generic, non-specialized case -\#endif - -\#ifdef CVT - // Code specialized for a specific CVT -\#endif -``` - -When using the library, you include it multiple times with different CVT definitions: - -```c -// First include with CVT undefined for base definitions -\#include "TM.lib.c" - -// Then include with CVT defined for each type specialization -\#define CVT int -\#include "TM.lib.c" -\#undef CVT - -\#define CVT float -\#include "TM.lib.c" -\#undef CVT -``` - -\subsection{Template-Based Type Generation} -\label{sec:orgcde6c14} - -The template system generates several types of identifiers: - -\begin{enumerate} -\item \textbf{\textbf{Type names}}: `Ξ(TM, CVT)` becomes `TM·int` when CVT is defined as `int` -\item \textbf{\textbf{Function names}}: `Ξ(TM·Array, CVT)·init\textsubscript{pe}` becomes `TM·Array·int·init\textsubscript{pe}` -\item \textbf{\textbf{Variable names}}: `Ξ(extent\textsubscript{t}, CVT)` becomes `extent\textsubscript{t}·int` -\end{enumerate} - -\subsection{Function Given (FG) Tables} -\label{sec:org691e6ba} - -A key part of our implementation is the Function Given (FG) table pattern. Each implementation of the tape machine provides an FG table containing function pointers for its operations. - -The FG tables are specialized based on the CVT: - -```c -typedef struct \{ - TM·FG *fg; // Base function table - Ξ(extent\textsubscript{t}, CVT) (*extent)(TM *tm); - CVT (*read)(TM *tm); - void (*write)(TM *tm, CVT *remote\textsubscript{pt}); -\} Ξ(TM, CVT)·FG; -``` - -This allows for type-safe operations while maintaining a consistent interface. - -\subsection{Benefits of This Approach} -\label{sec:org5338608} - -\begin{enumerate} -\item \textbf{\textbf{Type safety}}: The compiler checks that the correct types are used with each specialized function -\item \textbf{\textbf{Code reuse}}: Common functionality is defined once and specialized for different types -\item \textbf{\textbf{Consistent naming}}: The Ξ macro ensures a consistent naming convention -\item \textbf{\textbf{Modularity}}: Different implementations can share the same interface -\end{enumerate} - -\subsection{Limitations} -\label{sec:org70b9fc6} - -\begin{enumerate} -\item \textbf{\textbf{Verbosity}}: More verbose than native templates in C++ -\item \textbf{\textbf{Complexity}}: Requires understanding of preprocessor macros and conditional compilation -\item \textbf{\textbf{Debugging}}: Preprocessor-generated code can be harder to debug -\item \textbf{\textbf{Limited IDE support}}: Most IDEs don't understand this template system for code completion -\end{enumerate} - -Despite these limitations, this approach provides a powerful way to implement generic, type-safe code in C without resorting to void pointers or code duplication. - -\section{Generalizing type} -\label{sec:orgbc78d46} - -\subsection{Passing a TM FG table instance} -\label{sec:org326c1a7} - -\begin{enumerate} -\item Suppose we have a generic TM FG table with the declared functions constituting the architecture (user's view, interface) of a tape machine. - -\item Instances of this TM FG table represent different implementations of the architecture. For example, TM·Array·fg for a TM implemented as an array, and TM·Function·fg for a function implementation (similar to the Natural\textsubscript{Number} in the Java implementation). - -\item Now suppose we have a function `map` that is given a TM\textsubscript{read}, a TM\textsubscript{write}, and a function. -The map does not care how the TM is implemented. - -If these first two arguments are declared as TM FG type, then they can accept any fg table whether it be an Array implementation, a Function implementation, etc. The map can then pick the functions it needs, such as step and rightmost, from the -table, and thus get tape behavior. - -This achieves what we wanted: a map function that can use a tape machine and does not care what the implementation of that tape machine is. - -However, the TM functions that map calls require a first argument that holds the TM instance data. Without this, it cannot know which machine is being operated on. -Furthermore, the instance data type must match the TM fg table type. - -Given steps 1 through 3, we never passed in instance data to map, only a TM FG table instance. So map has a type, but not the data. -\end{enumerate} - - -\subsection{Passing TM instance data, compile in the fg table} -\label{sec:orged57256} - -\begin{enumerate} -\item As noted, `map` is given a TM\textsubscript{read}, a TM\textsubscript{write}, and a function. For these first two -arguments, suppose we pass in the instance data, i.e., struct pointers. - -\item The TM·Array struct will hold a base pointer to the array and the head location. The TM·Function struct would hold a handle recognized by the functions or some state used by them. - -\item Then we have a map function for each architecture type, and we compile into each of these a call to the correct default TM·fg table. The map·Array will have TM·Array·fg compiled into it, and the map·Function will have TM·Function·fg compiled into it, etc. - -\item This approach works, but we duplicate the map code many times just to get the types to match the calls. -\end{enumerate} - - -\subsection{Passing in both the TM instance data and corresponding TM FG tables instances} -\label{sec:orgf9f5316} - -\begin{enumerate} -\item Say we have one generic `map` that takes 5 arguments: TM\textsubscript{read} (an instance), TM\textsubscript{read}\textsubscript{fg}, a TM\textsubscript{write} (an instance), and TM\textsubscript{write}\textsubscript{fg}, plus the function to apply. - -\item The instance parameters must be declared `void *` to prevent argument checking on them; otherwise, it will be necessary to implement many map functions for each instance type combination. - -\item This works, though we have no way to know if the correct type of instance data that matches the fg table was actually passed in. - -\item We could create many wrapper functions to accomplish the instance data type check, then call a central map function with `void *` instance data pointers. With any luck, the optimizer would make this extra layer go away, so it will be efficient. Still, map now has 5 arguments instead of the three that are natural for the problem. -\end{enumerate} - - -\subsection{Using a "vtable"} -\label{sec:orga3c331a} - -\begin{enumerate} -\item All TM instance types are structs with a first field that points to the fg table, -regardless of the implementation type. This is not a serious requirement because -each implementation type already has a struct for its implementation data. However, it does make an instance bigger, and it is not clear that the optimizer will be able to -optimize it effectively. - -\item Then a generic fg table is created, where the functions have the signatures as specified -in the FG table. However, each of these functions follows the fg table pointer in the -instance data given to it as a first argument, and then calls that function. - -\item It works, and it is a tried and true method. -\end{enumerate} - -\subsection{Using a pointer pair} -\label{sec:orgc9d996e} - -\begin{enumerate} -\item Instead of the instance data being called the 'TM type', a pair is the 'TM type'. -The first member of the pair points to an instance, the second to a corresponding -fg table. - -\item Again there are some generic TM functions, each accepts a pair as a first argument, and then calls the corresponding fg table function while giving it the instance pointer -from the pair as the first argument. - -\item This approach packs the same information as the vtable approach. If there is a -one-to-one correspondence between instances and pairs, then it is larger by one pointer. - -\item This is a type of 'link' from our continuations, but the tableau pointer is gone due -to using a stack frame, and the continuation table pointer is gone due to flow-through sequencing. Thus it is two pointers instead of 4. - -\item Hopefully, the optimizer would recognize that the pair pointers are redundant. They are only needed to ensure that the instance and fg table go together. -\end{enumerate} - -\subsection{Instance curried dispatch function} -\label{sec:orga7d5cdc} - -\begin{enumerate} -\item In this case, a pointer to a function is the 'TM type'. There is an enum that gives numeric tags to each of the functions in the FG struct instance. - -\item The tag for the desired fg function to be called is passed as the first argument to the dispatch function, and the remaining arguments are for the fg function. - -\item The dispatch function has the instance data and fg table pointer curried into it, so it then calls the correct fg function while providing it with the correct instance data. - -\item In C, it is not immediately obvious how to create a function on the fly each time an -instance is created to curry the instance data into it, and then later how to call -the newly created function. -\end{enumerate} - -\subsection{Self-typed Instance and dispatch function} -\label{sec:orge6b7e0a} - -\begin{enumerate} -\item With this method, an extra field is added to the instance data that identifies its type. Then a globally available TM-specific dispatch function is called to run the desired fg function on the data. It is similar to the dispatch function from above, but the instance data is an additional argument. - -\item The dispatch function uses the type information to know which fg table to call. This type information could be a pointer to the appropriate fg table. - -\item This approach differs from the vtable method in that all the arguments are given to the one TM dispatch function, and it figures out how to do the dispatch. There is not a wrapper-per-function. -\end{enumerate} - -\subsection{Which approach?} -\label{sec:org6c9a58c} - -We want to be able to declare an instance as a local variable, where it will end up being on the stack frame. We want to avoid heap allocation for performance reasons, but not exclude the use of heap memory. - -Dynamically created functions are out of the question. Dispatch approaches require the enum table to have tags. This is not a show-stopper. However, having one dispatch function means the argument types are not checked. That is a problem. - -Doubled-up arguments (one for the instance, the other for the table) either require wrappers or do not check that an instance really goes with the data. Besides, it requires a lot of typing. - -The pointer pair approach requires the separate maintenance of the pair. When these are local variables, the pair has to be tied to the instance. This would require the user to be aware of the existence of both the instance data and the pair, to pass them to an initializer. This could be avoided if the pair were combined with the instance, but that -is identical to the vtable approach (the instance pointer no longer being needed). - -So we are led to the vtable approach, though we are still hoping for the curried dispatch function - lol. - -\section{Implementation Details} -\label{sec:org009bd61} - -\subsection{Main objects} -\label{sec:org4c8ad02} - -\begin{enumerate} -\item Ξ(TM, CVT)·FG table (CVT is a template for the tape cell value type). -\item Ξ(TM, CVT) instance, typically declared as a local variable. -\item FG Ξ(TM·Array, CVT)·fg, which is a Ξ(TM, CVT)·FG type, provides pointers to function -wrappers that are given a Ξ(TM, CVT) instance. Each wrapper then calls the function found in the -instance's vtable. -\end{enumerate} - -\subsection{Declaration} -\label{sec:org2d5c70b} - -\begin{enumerate} -\item With CVT not defined, \#include "TM.lib.c" in FACE section. -\item With each different CVT value defined, \#include "TM.lib.c" in FACE section again. -\item Do the same in the IMPLEMENTATION section. -\end{enumerate} - -\subsection{Instantiation} -\label{sec:orgf6668e0} - -\begin{enumerate} -\item Define a local variable, or get from malloc, a Ξ(TM, CVT) type, say `tm`. -\item Call init(tm). -\end{enumerate} - -\subsection{Use} -\label{sec:orgcb2825f} - -\begin{enumerate} -\item Call, for example, Ξ(TM·Array, CVT)·fg.step(tm), where tm is a Ξ(TM, CVT) type. -\end{enumerate} - -\subsection{FG table instances} -\label{sec:org4267ad9} - -There can be multiple instances of an FG table, each with functions that are implemented differently, though they share the same FG table type. - -Each CVT and FG table instance type will have a different tableau struct. Each tableau struct will have the type Ξ(TM·, CVT), where is the FG instance table type. For example, Ξ(TM·Array, CVT) is a struct of state variables for an Array implementation of the TM. - -\subsection{One for all FG table} -\label{sec:orga349d27} - -The "TM.lib.c" file defines an FG type called Ξ(TM, CVT)·FG. Note that CVT is a template -parameter. Hence, giving different CVT bindings, there will be different FG tables. - -For each Ξ(TM, CVT)·FG, there can be a number of Ξ(TM·, CVT)·fg instances. For -example, Ξ(TM·Array, CVT)·fg. Each of these is a parameterized table. - -A user has an fg table to call functions from. This is either passed in or, more -likely, found at global scope after including "TM.lib.c", and then including it again for -each value of the CVT variable to be used. - -For each implementation type, there is a struct defined called Ξ(TM·, CVT), -note the lack of further suffix. Instances of this type are said to be instances of the tape -machine. `FG` stands for `function given`, and what each said function is given is one or more arguments of the Ξ(TM·, CVT) type. - -When a user wants a tape machine, the user makes an instance of a Ξ(TM·, CVT). -This is then handed to a function called Ξ(TM·, CVT)·init(). The init function is given whatever parameters are needed for initializing the instance, and it returns a more generalized pointer of type `Ξ(TM, CVT) *`. - -After initialization, the Ξ(TM·, CVT) instance will have a first field value that points to the Ξ(TM·, CVT)·fg table. However, the pointer to this instance will be of the type returned by init, which is `Ξ(TM, CVT) *` (notice it lost the implementation). This more generic pointer can now be used with the generic instance of the -Ξ(TM, CVT)·FG table, Ξ(TM, CVT)·fg, which holds wrapper functions that make use of the -first field value to find the real fg table and to call those functions. - -Hence, after the user calls the correct init for the specific instance made, the resulting pointer points to the same type object independent of the implementation of the functions. Thus, code written to manipulate TMs can be written in a manner that is agnostic to the implementation of those TMs. - -When a function is called, say Ξ(TM, CVT)·fg.step(tm), it is passed the generic type `Ξ(TM, CVT) *`, tm. This will call the step wrapper function, which will in turn pass the same arguments (in this case, only `tm`) to the step function found in the fg table pointed to by the first member of the tm struct. - -\subsection{Separate FG tables} -\label{sec:orgafbf17c} - -In the flat fg table approach described in the prior section, each wrapper function table of the form Ξ(TM, CVT)·fg, obtained by setting the CVT template to a type value, will have a full set of wrapper function pointers. When a wrapper function is the same independent of the CVT variable, it still has a pointer copied into each fg table. Thus, there will be a lot of redundancy in the tables if many functions are not CVT-specific. - -For the layered fg table, there are separate wrapper function tables for the wrappers that are independent of CVT and those that are CVT-differentiated. The user then calls functions from the CVT-independent table when invoking those functions and from the CVT-differentiated functions table when calling those. So, for example, the user would call TM·fg.step(tm) to do a step, as that is CVT-independent, but call Ξ(TM, CVT)·fg.read(tm) to do a read, as the read value is CVT-differentiated. - -\subsection{Direct access through instance field (Orrin suggestion)} -\label{sec:orgfe58dd7} - -Instead of calling fg functions through a globally visible table such as: - -```c -fg->step(tm); // Wrapper style -``` - -where fg is of type Ξ(TM, CVT)·FG and calls to it require globally accessible wrapper functions, - -we can use the instance's first field directly: - -```c -tm->fg->step(tm); -``` - -Here, tm is a Ξ(TM, CVT) * — the generic type returned by init — and fg is the first field of the instance pointing to the correct FG table. - -This style removes the need for wrapper functions entirely. Each TM implementation embeds its corresponding FG table pointer directly in the instance. Thus, no global wrapper needs to be referenced, and function type-checking is preserved at compile time. - -If there are CVT-independent functions, we can use a layered FG table. Each CVT-specific FG table includes a pointer to a base table: - -```c -tm->fg->base->step(tm); \emph{/ Access shared, CVT-independent function -tm->fg->read(tm); /} Access CVT-specific function -``` - -This structure mimics prototype delegation in JavaScript, except we resolve the chain explicitly with types, not dynamic name resolution. - -The benefit of this approach is that the user only needs to have the instance in scope — no global FG table declarations. All function dispatch is local and type-safe. - -The only remaining user burden is knowing whether a function is CVT-specific or not. This is made obvious by whether the function appears in the base or CVT-differentiated FG struct, and the compiler will catch mismatches. - -(Contribution by Orrin — co-author) - -\section{Observations} -\label{sec:org46e6336} - -C does not have automatic conversion of a child type to its parent; instead, it will give a type mismatch error. - -The vtable pattern with separate tables will have a CVT-differentiated fg table pointer on the tableau. Without the function wrappers, a call can occur like this: - -```c -tm->fg->step(tm) -``` - -Or even with the wrappers and a globally available fg table: - -```c -fg->step(tm) -``` - -In both of these, `step` will be the CVT-differentiated version of step, so types will match, and these calls work. - -However, things change when we want to call the non-CVT-differentiated shared table: - -```c -tm->TM·fg->mount(tm) -``` - -Due to `mount` being in the shared fg table that has type `TM·fg` where it expects to be given arguments of type `TM *`, and having type `TM·`, there will be a type mismatch -error on the call. The programmer will be compelled to fix this with a cast: - -```c -tm->TM·fg->mount((TM *)tm) -``` - -Requiring the programmer to defeat the type system by habit is not a good approach. - -So the one solution that does work is the one big table per type. All functions will then have correct signatures in the FG declaration. In the implementation, the more generic functions can be cast when assigned directly to the fg table function pointers, or wrappers that delegate can be written and assigned to the fg table function pointers. - -\section{Conclusion} -\label{sec:org1380bd0} - -After examining various approaches to type abstraction in C, the vtable pattern emerges as the most practical solution for our tape machine implementation. While it has some overhead in terms of memory usage, it provides the best balance of type safety, ease of use, and performance. - -The direct access through instance field approach suggested by Orrin offers an elegant alternative that eliminates the need for wrapper functions while maintaining type safety. This approach is particularly appealing for its simplicity and the fact that it keeps all the necessary information localized to the instance. - -For projects where performance is critical, the "one big table per type" approach may be the most efficient, as it avoids the need for type casting while still providing a clean interface. - -Ultimately, the choice of approach depends on the specific requirements of the project, but the vtable pattern and its variations provide a solid foundation for type abstraction in C programming. -\end{document} diff --git "a/document\360\237\226\211/RT_C_namespace.org" "b/document\360\237\226\211/RT_C_namespace.org" index 39aa868..e4d353a 100644 --- "a/document\360\237\226\211/RT_C_namespace.org" +++ "b/document\360\237\226\211/RT_C_namespace.org" @@ -1,21 +1,174 @@ #+TITLE: RT C Namespace Convention -#+AUTHOR: Thomas +#+AUTHOR: Sorein +#+DATE: 2025-04-25 * 1. Namespaces in RT C -C does not provide a built-in mechanism for namespaces, so RT C adopts a *prefix plus scoping operator* convention. The part before the “·” (for example, “N32”) is treated as the namespace name, and the “·” symbol is a stand-in for an (as yet) unofficial scoping operator. +C has no formal namespace system, so RT C introduces a **middle-dot namespace convention** to provide **clarity, collision avoidance, and modular structure** in large, macro-heavy codebases. -For instance, in “N32·allocate_array=”: -- “N32” is the namespace prefix. -- “·” (the middle dot) is our ad hoc scoping operator. -- “=allocate_array=” is the actual function name. +The `·` symbol (U+00B7, **middle dot**) is used as a visual and semantic scoping operator between **namespace components**, similar to how `::` is used in C++ or `.` in Java. -** Advantages of the “Project·Name” Convention -1. **Collision Avoidance**: Prefixing everything with “N32·” (or another module name) ensures identifiers do not collide with those from other libraries or system headers. -2. **Clarity**: Readers can see at a glance which library an identifier belongs to. -3. **Easy to Evolve**: If a future version of C introduces formal namespaces, the “=N32=” prefix and “·” operator could map directly into that syntax. -4. **Organized Reusability**: In large codebases with multiple modules, each module has a unique prefix (“N8·”, “N16·”, “N32·”, etc.), making it straightforward to locate definitions and references in a text search. +This convention applies uniformly to: +- Function names +- Type names +- Structs +- Macros (especially templated forms) +- Dispatch tables -** Example Namespace Prefix -When building a 32-bit numeric library, all its public symbols are prefixed with `N32·`. Private/internal symbols (seen only within the file) may also use the prefix but are marked with `Local` or guarded by `#ifdef LOCAL` so they do not pollute the global symbol table. +Example: +#+BEGIN_SRC c +N32·allocate_array +Core·round_up +TM·AU·Array·init_pe +#+END_SRC +Here, each `·` separates conceptual scopes: +- `TM·AU·Array·init_pe` means: `init_pe` function, inside `Array` implementation, for the `AU` cell type, inside the `TM` module. + +* 1.5 The Middle Dot: Syntactic Sugar and Token Trickery + +The character `·` (U+00B7, **middle dot**) is **not** special in the C language. To the C preprocessor and compiler, it's simply a valid identifier character—just like `A_Z` or `foo42`. + +That means: + +#+BEGIN_SRC c +TM·AU·Array·init_pe +#+END_SRC + +is **just one long identifier**. The compiler doesn't see it as hierarchical—only as a single symbol. The visual segmentation is entirely for the *reader's* benefit, not the *compiler's*. + +> For now, the middle dot is syntactic sugar. But someday, perhaps, a future C or C++ might embrace it as a real scoping operator. We prepare the ground. + +However, when we want to *construct* identifiers programmatically via macros, `·` by itself is not enough. **The C preprocessor does not treat `·` as an operator**, so it won't concatenate tokens with it unless we explicitly instruct it. + +To solve this, RT C defines the following macro in `cpp_ext.c`: + +#+BEGIN_SRC c +#define ·(A,B) A##·##B +#+END_SRC + +This turns: + +#+BEGIN_SRC c +·(TM,AU) → TM·AU +#+END_SRC + +And can be chained: + +#+BEGIN_SRC c +·(·(TM,AU),Array) → TM·AU·Array +#+END_SRC + +For convenience and clarity, template variable values must be defined *before* expansion. For instance: + +#+BEGIN_SRC c +#define _Box_T_ int +#define _TM·CVT_ AU +#+END_SRC + +When these are defined in this manner, the macro `·(...)` allows us to produce the following expansions: + +| Macro Invocation | Resulting Identifier | +|--------------------------------+-------------------------------| +| `·(Box_Box,_Box_T_)` | `Box_Box·int` | +| `·(Box_set,_Box_T_)` | `Box_set·int` | +| `·(TM,_TM·CVT_)` | `TM·AU` | +| `·(TM,_TM·CVT_,Array)` | `TM·AU·Array` | +| `·(TM,_TM·CVT_,Array,init_pe)` | `TM·AU·Array·init_pe` | + +This macro-based approach makes template expansion **predictable, readable, and modular**—while preserving the middle dot as a **structural visual** and a **join point** for layered namespaces. + +In summary: + +- As a **literal**, `·` is a harmless identifier character. +- As a **macro call**, `·(...)` is a *token concatenator* that inserts middle dots between parts. +- This duality is key to templating and namespacing in RT C. + +* 2. Purpose of the Middle Dot + +**The `·` is not just cosmetic**—it encodes structured meaning: + +| Position | Meaning | +|----------+----------------------------------| +| Leftmost | Module namespace (e.g. `TM`) | +| Middle | Type or submodule scoping | +| Rightmost| Symbol or function identifier | + +This gives the illusion of *semantic depth* within a flat C symbol space. It also facilitates: +- Greppable identifiers +- Predictable naming for macros, typedefs, and tables +- Avoidance of conflicts in shared headers + +* 3. Template Variable Convention: `_Var_` + +Template variables are identified with **leading and trailing underscores**, e.g. `_TM·CVT_`. These are used to parameterize includes and define generic logic. + +When a template is instantiated: +- The value of `_Var_` is set (e.g. `_TM·CVT_ = AU`) +- The file is included +- A guard macro (e.g. `SET__TM·AU`) is defined + +This ensures one instantiation per type per translation unit. + +Example: +#+BEGIN_SRC c +#define _TM·CVT_ AU +#include "TM.lib.c" +#define SET__TM·AU + +#define _TM·CVT_ Str +#include "TM.lib.c" +#define SET__TM·Str +#+END_SRC + +* 4. Guard Macros: SET__Module__Type + +To prevent multiple expansions of the same template with the same argument, we define a sentinel macro after inclusion: + +#+BEGIN_SRC c +#if !defined(SET__TM·AU) +#define SET__TM·AU +... +#endif +#+END_SRC + +These guards allow repeated template includes in a single TU, and avoid the fragile workaround of modifying headers manually. + +* 5. Practical Naming Examples + +| Symbol | Meaning | +|----------------------------------+---------------------------------------------------| +| `Core·FG` | Function dictionary for the Core module | +| `TM·AU·FG` | Function dictionary for TM with AU cell type | +| `TM·Str·Array·init_pe` | Init function for TM with Str cell type, Array impl | +| `SET__Binding__TM·AU` | One-time expansion guard for Binding of TM·AU | +| `extent_t·AU` | Type alias for extent of AU array | +| `FG·Type` | Template variable name for FG expansion | + +* 6. Why Not Use Underscores or CamelCase? + +While underscores (`_`) are idiomatic in C, they don't offer visual scoping in the same way, especially when chained deeply. Middle dots provide: + +- **Visual segmentation** across layered modules +- **Improved grepability**: `grep TM·` finds all TM-related symbols +- **Avoidance of macro clashes**: underscores often clash with system headers, especially when using `__NAME__` forms +- **Harmony with macro join operations** like `·(...)` + +* 7. Future Compatibility + +If C ever adopts formal module systems or namespaces, the `·` syntax can be systematically translated into official syntax, e.g.: + +- `TM·AU·Array·init_pe` → `TM::AU::Array::init_pe` +- Greppable → parseable → mappable + +For now, `·` is an elegant compromise between form, function, and forward-compatibility. + +* 8. Summary + +RT C namespaces provide: +- Scoped, composable identifiers +- Greppable structure for large projects +- Seamless macro templating and type specialization +- Collision resistance without verbosity + +By adopting `Module·Type·Submodule·Function` naming, your C code remains modular, clean, and scalable. diff --git "a/document\360\237\226\211/temp.txt" "b/document\360\237\226\211/temp.txt" new file mode 100644 index 0000000..a734ec4 --- /dev/null +++ "b/document\360\237\226\211/temp.txt" @@ -0,0 +1,90 @@ +#+TITLE: Proposed TM Bulk Methods for Multi-Cell Copy +#+AUTHOR: Sorein +#+DATE: 2025-04-25 + +* 1. Motivation: Efficient Copy Needs Bulk Cell Access + +The standard `read` and `write` methods in TM operate on **one cell at a time**, which is: +- Clear +- Safe +- Sufficient for most loops + +However, when implementing **bit-for-bit stream copy** between TMs, we want to: +- **Copy multiple cells at once**, where possible +- Use the largest available unit per cell +- Avoid stepping repeatedly through the same control path + +To support this, TM needs **bulk methods** for cell span access. + +* 2. What Is a Span? + +A **span** is a run of **N contiguous cells** available from the current tape head. + +A TM can only offer a span if: +- The head is *on tape* +- At least `N` cells are accessible to the right +- The memory layout is contiguous + +Not all TM types (e.g. cyclic or zero-length) support spans. For others, it's an optimization. + +* 3. Proposed TM Methods + +Each method is defined per CVT type. For example, `TM·AU` would add: + +#+BEGIN_SRC c +bool TM·AU·can_span(TM·AU tm ,size_t count); +AU const* TM·AU·peek_span(TM·AU tm ,size_t count); +AU* TM·AU·claim_span(TM·AU tm ,size_t count); +void TM·AU·commit_span(TM·AU tm ,size_t count); +size_t TM·AU·remaining(TM·AU tm); +#+END_SRC + +* 4. Semantics + +| Method | Purpose | +|------------------+--------------------------------------------------------------| +| `can_span(n)` | Returns true if N contiguous cells can be read or written | +| `peek_span(n)` | Returns a read-only pointer to N contiguous cells, or NULL | +| `claim_span(n)` | Returns a writable pointer to N cells, or NULL | +| `commit_span(n)` | Advances the head right by N cells (must follow claim) | +| `remaining()` | Returns the number of cells remaining from head to end | + +* 5. Guarded Use Pattern + +A `Copy` implementation might use: + +#+BEGIN_SRC c +while( TM·AU·can_span(src ,n) && TM·AU·can_span(dst ,n) ){ + AU const* s = TM·AU·peek_span(src ,n); + AU* d = TM·AU·claim_span(dst ,n); + memcpy(d ,s ,n * sizeof(AU)); + TM·AU·commit_span(src ,n); + TM·AU·commit_span(dst ,n); +} +#+END_SRC + +This avoids looping through `read`/`write` per cell and reduces dispatch overhead. + +* 6. Optional Implementation and Capability Flag + +Not all TM types can support spans. We can: + +- Add a `supports_span` method to the FG table +- Or define a `TM·Capability` bitfield: + +#+BEGIN_SRC c +typedef enum{ + TM·Caps·none = 0, + TM·Caps·span = 1 << 0 +} TM·Caps; +#+END_SRC + +* 7. Summary + +Bulk cell access enhances TM's ability to support: +- Efficient copy +- Block-based streaming +- Memory-mapped operations +- Potential SIMD and vectorization later + +By introducing the five methods above, TM becomes *not* diff --git a/tool_shared/third_party/RT-project-share b/tool_shared/third_party/RT-project-share index 82f857e..d5af4fd 120000 --- a/tool_shared/third_party/RT-project-share +++ b/tool_shared/third_party/RT-project-share @@ -1 +1 @@ -/home/Thomas-masu/developer/RT-project-share/ \ No newline at end of file +/home/Thomas/subu_data/developer/RT-project-share/ \ No newline at end of file diff --git a/tool_shared/third_party/emacs_30.0.92 b/tool_shared/third_party/emacs_30.0.92 index 3840045..3168c76 120000 --- a/tool_shared/third_party/emacs_30.0.92 +++ b/tool_shared/third_party/emacs_30.0.92 @@ -1 +1 @@ -/home/Thomas-masu/developer/emacs_30.0.92 \ No newline at end of file +/home/Thomas/subu_data/developer/emacs_30.0.92/ \ No newline at end of file -- 2.20.1