String-like-things are being created and printed correctly; bind is broken.

This commit is contained in:
Simon Brooke 2026-04-17 18:40:32 +01:00
parent cf05e30540
commit ca5671f613
8 changed files with 508 additions and 450 deletions

View file

@ -3,8 +3,8 @@
*
* Post Scarcity Software Environment: print.
*
* Print basic Lisp objects..This is :bootstrap layer print; it needs to be
* able to print characters, symbols, integers, lists and dotted pairs. I
* Print basic Lisp objects..This is :bootstrap layer print; it needs to be
* able to print characters, symbols, integers, lists and dotted pairs. I
* don't think it needs to be able to print anything else.
*
* (c) 2026 Simon Brooke <simon@journeyman.cc>
@ -12,6 +12,7 @@
*/
#include <ctype.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -36,93 +37,130 @@
#include "payloads/cons.h"
#include "payloads/integer.h"
struct pso_pointer in_print( struct pso_pointer p, URL_FILE * output );
#include "ops/truth.h"
struct pso_pointer print_list_content( struct pso_pointer p, URL_FILE *output ) {
struct pso_pointer result = nil;
struct pso_pointer in_print(struct pso_pointer p, URL_FILE *output);
if ( consp( p ) ) {
for ( ; consp( p ); p = c_cdr( p ) ) {
struct pso2 *object = pointer_to_object( p );
struct pso_pointer print_string_like_thing(struct pso_pointer p,
URL_FILE *output) {
switch (get_tag_value(p)) {
case KEYTV:
url_fputwc(L':', output);
break;
case STRINGTV:
url_fputwc(L'"', output);
break;
}
result = in_print( object->payload.cons.car, output );
if (keywordp(p) || stringp(p) || symbolp(p)) {
for (struct pso_pointer cursor = p; !nilp(cursor);
cursor = pointer_to_object(cursor)->payload.string.cdr) {
url_fputwc(pointer_to_object(cursor)->payload.character.character,
output);
}
}
if ( exceptionp( result ) )
break;
switch ( get_tag_value( object->payload.cons.cdr ) ) {
case NILTV:
break;
case CONSTV:
url_fputwc( L' ', output );
break;
default:
url_fputws( L" . ", output );
result = in_print( object->payload.cons.cdr, output );
}
}
} else {
// TODO: return exception
}
return result;
if (stringp(p)) {
url_fputwc(L'"', output);
}
}
struct pso_pointer in_print( struct pso_pointer p, URL_FILE *output ) {
struct pso2 *object = pointer_to_object( p );
struct pso_pointer result = nil;
struct pso_pointer print_list_content(struct pso_pointer p, URL_FILE *output) {
struct pso_pointer result = nil;
if ( object != NULL ) {
switch ( get_tag_value( p ) ) {
case CHARACTERTV:
url_fputwc( object->payload.character.character, output );
break;
case CONSTV:
url_fputwc( L'(', output );
result = print_list_content( p, output );
url_fputwc( L')', output );
break;
case INTEGERTV:
url_fwprintf( output, L"%d",
( int64_t ) ( object->payload.integer.value ) );
break;
case TRUETV:
url_fputwc( L't', output );
break;
case NILTV:
url_fputws( L"nil", output );
default:
// TODO: return exception
}
} else {
// TODO: return exception
}
if (consp(p)) {
for (; consp(p); p = c_cdr(p)) {
struct pso2 *object = pointer_to_object(p);
return result;
result = in_print(object->payload.cons.car, output);
if (exceptionp(result))
break;
switch (get_tag_value(object->payload.cons.cdr)) {
case NILTV:
break;
case CONSTV:
url_fputwc(L' ', output);
break;
default:
url_fputws(L" . ", output);
result = in_print(object->payload.cons.cdr, output);
}
}
} else {
// TODO: return exception
}
return result;
}
struct pso_pointer in_print(struct pso_pointer p, URL_FILE *output) {
struct pso2 *object = pointer_to_object(p);
struct pso_pointer result = nil;
if (object != NULL) {
uint32_t v = get_tag_value(p);
switch (v) {
case CHARACTERTV:
url_fputwc(object->payload.character.character, output);
break;
case CONSTV:
url_fputwc(L'(', output);
result = print_list_content(p, output);
url_fputwc(L')', output);
break;
case INTEGERTV:
url_fwprintf(output, L"%d",
(int64_t)(object->payload.integer.value));
break;
case KEYTV:
case STRINGTV:
case SYMBOLTV:
print_string_like_thing(p, output);
break;
case NILTV:
url_fputws(L"nil", output);
break;
case READTV:
case WRITETV:
url_fwprintf(output, L"<%s stream: ", v == READTV ? "read" : "write");
in_print(object->payload.stream.meta, output);
url_fputwc(L'>', output);
break;
case TRUETV:
url_fputwc(L't', output);
break;
default:
// TODO: return exception
}
} else {
// TODO: return exception
}
return result;
}
/**
* @brief Simple print for bootstrap layer.
*
*
* @param p pointer to the object to print.
* @param stream if a pointer to an open write stream, print to there.
* @return struct pso_pointer `nil`, or an exception if some erroe occurred.
*/
struct pso_pointer c_print( struct pso_pointer p, struct pso_pointer stream ) {
URL_FILE *output = writep( stream ) ?
pointer_to_object( stream )->payload.stream.stream :
file_to_url_file( stdout );
struct pso_pointer c_print(struct pso_pointer p, struct pso_pointer stream) {
struct pso_pointer result = p;
URL_FILE *output = writep(stream)
? pointer_to_object(stream)->payload.stream.stream
: file_to_url_file(stdout);
if ( writep( stream ) ) {
inc_ref( stream );
}
if (writep(stream)) {
inc_ref(stream);
struct pso_pointer result = in_print( p, output );
result = in_print(p, output);
if ( writep( stream ) ) {
dec_ref( stream );
}
dec_ref(stream);
}
return result;
return result;
}