diff --git a/src/c/environment/environment.c b/src/c/environment/environment.c index b575fb9..8ca6b42 100644 --- a/src/c/environment/environment.c +++ b/src/c/environment/environment.c @@ -12,6 +12,7 @@ #include "debug.h" #include "environment/function_bindings.h" +#include "environment/privileged_keywords.h" #include "memory/memory.h" #include "memory/node.h" #include "memory/pointer.h" @@ -100,7 +101,9 @@ struct pso_pointer initialise_environment( uint32_t node ) { debug_print( U"\nEnvironment initialised successfully.\n", DEBUG_BOOTSTRAP, 0 ); - } + } + + initialise_privileged_keywords(frame_pointer); result = initialise_function_bindings(push_local( frame_pointer, make_frame_with_env(0, frame_pointer, result))); diff --git a/src/c/environment/function_bindings.c b/src/c/environment/function_bindings.c index 07a19c7..8b039d1 100644 --- a/src/c/environment/function_bindings.c +++ b/src/c/environment/function_bindings.c @@ -222,7 +222,7 @@ struct function_data function_initialisers[] = { U"`nil`.", ¬}, {U"or", - U"(or expressions...): returns `nil` if all of these `expressions...` " + U"(or expressions...): returns `nil` if every one of these `expressions...` " U"evaluates to `nil`, else `t`.", &or}, {U"true?", diff --git a/src/c/environment/privileged_keywords.c b/src/c/environment/privileged_keywords.c index 394fe09..56fbd62 100644 --- a/src/c/environment/privileged_keywords.c +++ b/src/c/environment/privileged_keywords.c @@ -41,10 +41,10 @@ struct pso_pointer privileged_keyword_location; struct pso_pointer privileged_keyword_name; -#define load_and_lock(var,val)var = lock_object(c_string_to_lisp_keyword(nil, val)) +#define load_and_lock(var,val)(var = lock_object(c_string_to_lisp_keyword(frame_pointer, val))) -struct pso_pointer initialise_privileged_keywords(struct pso_pointer env) { +struct pso_pointer initialise_privileged_keywords(struct pso_pointer frame_pointer) { load_and_lock(privileged_keyword_bootstrap, PK_BOOTSTRAP); load_and_lock(privileged_keyword_documentation, PK_DOCUMENTATION); load_and_lock(privileged_keyword_location, PK_LOCATION); diff --git a/src/c/io/alphabets.h b/src/c/io/alphabets.h new file mode 100644 index 0000000..60e5ff3 --- /dev/null +++ b/src/c/io/alphabets.h @@ -0,0 +1,19 @@ +/* + * io/alphabets.h + * + * Post Scarcity Software Environment: alphabets + * + * I probably don't need these at this stage and may never in fact need them, + * but... + * + * (c) 2026 Simon Brooke + * Licensed under GPL version 2.0, or, at your option, any later version. + */ + +#ifndef __psse_io_io_h +#define __psse_io_io_h + +#define GREEK L"ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩω" +#define ELDERFUTHARK L"ᚠᚢᚦᚨᚱᚲᚷᚹᚺᚾᛁᛃᛈᛇᛉᛊᛏᛒᛖᛗᛚᛜᛞᛟ" + +#endif \ No newline at end of file diff --git a/src/c/io/print.c b/src/c/io/print.c index c627e8d..d1dfcb4 100644 --- a/src/c/io/print.c +++ b/src/c/io/print.c @@ -189,8 +189,14 @@ struct pso_pointer in_write( struct pso_pointer p, URL_FILE *output, } else { url_fputws( L"", output ); } - } - break; + } break; + case FUNCTIONTV: { + struct pso2 *function = pointer_to_object(p); + url_fputws(L"payload.function.meta, output, escape, + indent); + write_char( L'>', output, escape ); + } break; case INTEGERTV: url_fwprintf( output, L"%d", ( int64_t ) ( object->payload.integer.value ) ); @@ -211,6 +217,13 @@ struct pso_pointer in_write( struct pso_pointer p, URL_FILE *output, indent ); write_char( L'>', output, escape ); break; + case SPECIALTV: { + struct pso2 *function = pointer_to_object(p); + url_fputws(L"payload.function.meta, output, escape, + indent); + write_char( L'>', output, escape ); + } break; case TRUETV: write_char( L't', output, escape ); break; diff --git a/src/c/ops/string_ops.c b/src/c/ops/string_ops.c index 54dbc15..95c6fc5 100644 --- a/src/c/ops/string_ops.c +++ b/src/c/ops/string_ops.c @@ -23,6 +23,7 @@ #include "memory/pso2.h" #include "memory/tags.h" +#include "ops/string_ops.h" #include "ops/truth.h" #include "payloads/cons.h" @@ -174,7 +175,7 @@ char *lisp_string_to_c_string( struct pso_pointer s ) { /** * Return a lisp symbol representation of this wide character string. In - * symbols, I am accepting only lower case characters. + * symbols, I am accepting only lower case characters and certain punctuation. */ struct pso_pointer c_string_to_lisp_symbol( struct pso_pointer frame_pointer, char32_t *symbol ) { @@ -183,7 +184,7 @@ struct pso_pointer c_string_to_lisp_symbol( struct pso_pointer frame_pointer, for ( int i = wcslen( symbol ) - 1; i >= 0; i-- ) { char32_t c = towlower( symbol[i] ); - if ( iswalpha( c ) || c == L'-' || c == L'*' ) { + if ( iswalpha( c ) || wcschr(L"-*|!?", c)) { result = make_symbol( frame_pointer, c, result ); } }