From e3f922a8bf3229687a98950e953789c768d21d57 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Mon, 30 Mar 2026 13:29:26 +0100 Subject: [PATCH] Added character as a first class object. Stepped through a run; it all works. --- src/c/memory/pso2.h | 11 +++++++---- src/c/payloads/character.h | 39 +++++++++++++++++++++++++++++++++++++ src/c/payloads/special.h | 24 +++-------------------- src/c/payloads/time.h | 4 +++- utils_src/tagvalcalc/tvc | Bin 16848 -> 16064 bytes 5 files changed, 52 insertions(+), 26 deletions(-) create mode 100644 src/c/payloads/character.h diff --git a/src/c/memory/pso2.h b/src/c/memory/pso2.h index 4cbad4a..0c36b29 100644 --- a/src/c/memory/pso2.h +++ b/src/c/memory/pso2.h @@ -12,8 +12,8 @@ #include -#include "../payloads/psse-string.h" #include "memory/header.h" +#include "payloads/character.h" #include "payloads/cons.h" #include "payloads/free.h" #include "payloads/function.h" @@ -22,9 +22,9 @@ #include "payloads/lambda.h" #include "payloads/nlambda.h" #include "payloads/read_stream.h" -#include "payloads/special.h" +#include "payloads/psse-string.h" #include "payloads/symbol.h" -// #include "payloads/time.h" +#include "payloads/time.h" #include "payloads/vector_pointer.h" #include "payloads/write_stream.h" @@ -38,13 +38,16 @@ struct pso2 { union { char bytes[16]; uint64_t words[2]; + struct character_payload character; struct cons_payload cons; struct free_payload free; struct function_payload function; struct integer_payload integer; struct lambda_payload lambda; -// struct special_payload special; + struct function_payload special; struct stream_payload stream; + struct string_payload string; +// TODO: this isn't working and I don't know why (error: field ‘time’ has incomplete type) // struct time_payload time; struct vectorp_payload vectorp; } payload; diff --git a/src/c/payloads/character.h b/src/c/payloads/character.h new file mode 100644 index 0000000..81a6dfa --- /dev/null +++ b/src/c/payloads/character.h @@ -0,0 +1,39 @@ +/** + * payloads/character.h + * + * A character object. + * + * Note that, instead of instantiating actual character objects, it would be + * possible to reserve one special page index, outside the normal page range, + * possibly even page 0, such that a character would be represented by a + * pso_pointer {node, special_page, character_code}. The special page wouldn't + * actually have to exist. This wouldn't prevent `nil` being 'the object at + * {n, 0, 0}, since the UTF character with the index 0 is NULL, which feels + * entirely compatible. UTF 1 is 'Start of heading', which is not used by + * anything I'm aware of these days, and is canonically not NULL, so I don't + * see why we should not continue to treat {n, 0, 1} as `t`. + * + * (c) 2026 Simon Brooke + * Licensed under GPL version 2.0, or, at your option, any later version. + */ + +#ifndef __psse_payloads_character_h +#define __psse_payloads_character_h +/* + * wide characters + */ +#include +#include + + +#define CHARTAG "CHR" +#define CHARTV 5392451 + +/** + * @brief a single character, as returned by the reader. + */ +struct character_payload { + wchar_t character; +}; + +#endif \ No newline at end of file diff --git a/src/c/payloads/special.h b/src/c/payloads/special.h index 4dcf7c2..b0ff91b 100644 --- a/src/c/payloads/special.h +++ b/src/c/payloads/special.h @@ -3,6 +3,9 @@ * * A special form. * + * No payload here; it would be identical to function_payload, q.v., so + * use that instead. + * * (c) 2026 Simon Brooke * Licensed under GPL version 2.0, or, at your option, any later version. */ @@ -21,25 +24,4 @@ #define SPECIALTAG "SFM" #define SPECIALTV 5064275 -// /** -// * @brief Payload of a special form cell. -// * -// * Currently identical to the payload of a function cell. -// * \see function_payload -// */ -// struct special_payload { -// /** -// * pointer to the source from which the special form was compiled, or NIL -// * if it is a primitive. -// */ -// struct pso_pointer meta; -// /** pointer to a function which takes a cons pointer (representing -// * its argument list) and a cons pointer (representing its environment) and a -// * stack frame (representing the previous stack frame) as arguments and returns -// * a cons pointer (representing its result). */ -// struct pso_pointer ( *executable ) ( struct pso4*, -// struct pso_pointer, -// struct pso_pointer ); -// }; - #endif diff --git a/src/c/payloads/time.h b/src/c/payloads/time.h index cc1ef0a..d808c0e 100644 --- a/src/c/payloads/time.h +++ b/src/c/payloads/time.h @@ -10,7 +10,9 @@ #ifndef __psse_payloads_cons_h #define __psse_payloads_cons_h +#include #include +#include #include "memory/pointer.h" @@ -26,7 +28,7 @@ * convenience, 14Bn years before 1st Jan 1970 (the UNIX epoch)) */ struct time_payload { - unsigned __int128_t value; + unsigned __int128 value; }; #endif diff --git a/utils_src/tagvalcalc/tvc b/utils_src/tagvalcalc/tvc index acd850a02231fc7f80d1516dc01c995fcc0d848b..374be1af28337f8ce0bb611058cab9ad29b93f2e 100755 GIT binary patch literal 16064 zcmeHOZ)_B48Gm z$&urN8rOzPFK5i%2MsZ~c!?K-$;B8FW8v=LP(xZj@c}Q@NK#@wxp?ZSC+qXfJiqC5 z*u4)X#%SgZGr#xw^Lw9no_S~b4*R~(Bo6n5Lm`FIpgylyDnuMj9EQ)LqEuY%RZVnm zRh!jvQa?mTT+DuqG&lxeqxi9!dEXMdA3rXBK=hE2dG*SR+#xDJCD*~cWo!`Hk1NA$ zR0;^Y8!u{`mGa>#cAx_E^0+HA?Y3FX>|csslz68F!DEqmbHbYwo{JK1P7wLzobWLy z`SfFyY+R!DSt&oSAUr>A6@MVd;KInqLX=Ka{1~;hi}AoaamPw=-QPdRejfTcD7=U` z`0+Cm4~Tfjh$llrJU$#SJdR7ediSqG?i)~Uhn*8{gU8yTfs-nHPEB)Py!N#ubGq5y za{X7wjy|z@cHif&RR6j#_k$Z3&&}@0q=)x(?Z~9sGwED;ynTG{p7uRmu~I&^Q*l_% z3Ag85*Rxbxyq~k?&8)4cbK<_OsbS;xYUxjrK3c=SvyOkcj{nL!{$H)*zlHRCJWxtj zF_$b%sH~C63*X_DiHK9bHEne-V`6^iMcHKN#yGq^_`I^5sW ztM82MjO}*oySkL#KXgP-nMHFnU9!yL(2?FuK4%UY!x@vB9L?r)5=3`gYdR{rKMizm zyhoVcmW!{Q^2Ri!qCxeD?zQK?O}8)=r zBYbaB-ty?>k+)4V9=-jZ6v8c!egzsKob%`r+cw7?C-x0HRr}l+cLdhs*|4Ajm+Ffgl6_p$ur}7aFz6WpD0KO8eTh6|T-`=ig|2-Hle= z{c|!^+kQ#s=GHjXSRP~h-MK22wyP}j6!Y$kEnjAtr+#;*ZTSqzBU4P^()ow}%IsIP z%5Syvzq>a$l<1u9yrEs#f0InrbvwxQy^&aRD}NO@@yPZpX|)T>xE<}$_pNo*-6pP6 zcUM;Dnp@AY@9To(f6VsZ{W!z+` mcIBM|+LiYkw9qwe_P({28u)e0X`rz>H`3gC zaFPF~=FNXUw|_NpRr%8=we$Nglc&-ucdS*~wPklm4t<$oyYZQS z_bD=-Bn~CFqjL7PRw>W?j3>SGZ{M$0wMyciHkr6LsVa$u>xmCIb-y2-Onjids9jk5 zCP|9SGg@dyn{3oBBo;37JYB2Y)GF8K&r$=EiG?-_pek2|w8}$zOPeI$Ym~1~HZkk^ zPq@MPlf*kuv52uRar^1#ZS4)Z&G!9Ya>v;}C_x5-3nc6AvMu!y`kLL;u#bO3<aj^)&78_ zI{%i*C3NPv3XMlXn^vu8oC>Xou%3Ur=Qg&mgOu9-N^K=O`%nF`T8*=BQ>3qH{o~CK zKh=0n9oV?%`l%n*VQZJ=l$J@xlhnhp?EJ7s_v%9*TcQ5mxnJ>k60nsM95#< z{M#!R{lm13?CY3uSid_;Z8ESckYtWPEFF6dCIg`MZk??0>#r&9i)oKdh)=E#W2pprnE|ez(L< zpPY92uHeIh>jl>d0)(dKW&I((-86B)_a)XUeoXX(5*Yd^=@|MwEq=UCl?&qkqv~7_ zsccvJ9o4?R)5518Vr?0Drq54X9uWKAL`J{u#{UZ^tRMG>-Xr6nPw)$Z@QcQs+M(Xw z$D-Q~n!{-$7wzn#)w3P#osVvpD!d;=&dWpU-KyWhc@C*Z+;!toad?EVmj7nbhiTWr zMSuT9KjYKy5R z{r9O-tN-<`>ovQbHEKSJ78bEqJ6CQ0k1GHD{DnRHmagf}RRTj;;ZdfsFqBzYaFmq=eL?yIDa&^YOcqXh>?ZT}{Bf6Nv!|495XuE6@K z_@9#Z^2=hlN_y_6-~T4*qab^5p7e<2QLBb9=ab%=zVWY4B#TyOEKh6Kjp4Lz8Ka66 zC96C#5=*MZb?&;A)swu^y+od=ygr)A4;vXhW#x+{-6)T%WIkKSn3kD}b=3CYrS@sv zC>D(g-OO3V2{lqQvZkIYXR{MT@kly(T1#B1Ur!pDB>kga>3ZMs?js33F>p|)RrUu@ z4Rjyr?|0pc zl$lFW6T_vFG$;EQXb%E%!J89m?l@Sw+hJ+5oNc9IrHQO%3=>*K2ggv$pgCtK0X z7)+2_A!Bii)Ug;F0; z@r-ObNu9}C9EZBfH#0^lRxujUSsJL`r|93W^ZbbC6!aL{1^bwQQPBf1-+;`k%e?%8 zOca3p|Ki?)_ZD>BRH0Xc8^7K@I{34%xA5P?zt9{7{l6sffru~D8F!wCHcn85=WO6( zUgx4XVjl{wAM>j(k)1<=k9i^x^FnFHzE;#3lXUPL41CPHfOxl~|L_AAh|hC6$e7mw zJ2(gxfBzk=QqNF@?+N&rR|2QS5%K-kUlD$f_+g$3)I5C7nVG+;vUhV!JkiQ3* z|4K73CLja9=i_7FDeyVpfJJmu{^#e1!pHqnQE?QcnaYyl=l__j+(qy){{mt^A{z1Y-|+F{QO6VbDu{x} z8`L+c;(dSA+lL8%fBf5IXrezn|c@dY!2bz85iey{?)xI3*qX t1R42}LVxi7=I0B2_wsM?2N)H1KeZ#e@kOLLd2Rl0b~_#$(a}2me*r4IBar|A literal 16848 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 Qy!}Vby2eV2frS