Another inconclusive session: still nothing works, still making progress.
This commit is contained in:
parent
ef59563e25
commit
eed4711fee
35 changed files with 317 additions and 232 deletions
|
|
@ -11,7 +11,6 @@
|
|||
* wide characters
|
||||
*/
|
||||
#include <uchar.h>
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
|
||||
#include "memory/node.h"
|
||||
|
|
@ -22,12 +21,12 @@
|
|||
|
||||
#include "ops/truth.h"
|
||||
|
||||
#include "payloads/character.h"
|
||||
// #include "payloads/character.h"
|
||||
|
||||
struct pso_pointer make_character( struct pso4 *frame_pointer, wint_t c ) {
|
||||
struct pso_pointer make_character( struct pso_pointer frame_pointer, wint_t c ) {
|
||||
struct pso_pointer result = allocate( frame_pointer, CHARACTERTAG, 2 );
|
||||
|
||||
if ( !nilp( result ) ) {
|
||||
if ( !c_nilp( result ) ) {
|
||||
pointer_to_object( result )->payload.character.character =
|
||||
( char32_t ) c;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,5 +38,5 @@ struct character_payload {
|
|||
char32_t character;
|
||||
};
|
||||
|
||||
struct pso_pointer make_character( struct pso4 *frame_pointer, wint_t c );
|
||||
struct pso_pointer make_character( struct pso_pointer frame_pointer, wint_t c );
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -25,93 +25,97 @@
|
|||
/**
|
||||
* @brief allocate a cons cell with this car and this cdr, and return a pointer
|
||||
* to it.
|
||||
*
|
||||
*
|
||||
* (cons object object)
|
||||
*
|
||||
* @param frame_pointer a pointer to a stack frame.
|
||||
* @return struct pso_pointer a pointer to the newly allocated cons cell.
|
||||
*/
|
||||
struct pso_pointer cons( struct pso_pointer frame_pointer ) {
|
||||
struct pso4 *frame = pointer_to_pso4( frame_pointer );
|
||||
struct pso_pointer result = allocate( frame, CONSTAG, 2 );
|
||||
struct pso_pointer cons(struct pso_pointer frame_pointer) {
|
||||
struct pso4 *frame = pointer_to_pso4(frame_pointer);
|
||||
struct pso_pointer result = allocate(frame_pointer, CONSTAG, 2);
|
||||
|
||||
if ( stackp( frame ) ) {
|
||||
struct pso2 *object = pointer_to_object( result );
|
||||
object->payload.cons.car =
|
||||
inc_ref( frame->payload.stack_frame.args[0] );
|
||||
object->payload.cons.cdr =
|
||||
inc_ref( frame->payload.stack_frame.args[0] );
|
||||
}
|
||||
struct pso2 *object = pointer_to_object(result);
|
||||
object->payload.cons.car = inc_ref(fetch_arg(frame, 0));
|
||||
object->payload.cons.cdr = inc_ref(fetch_arg(frame, 1));
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
struct pso_pointer make_cons(struct pso_pointer frame_pointer, struct pso_pointer car, struct pso_pointer cdr){
|
||||
return cons( make_frame(2, frame_pointer, car, cdr));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the car of this cons cell.
|
||||
*
|
||||
*
|
||||
* (car cell)
|
||||
*
|
||||
* @param frame_pointer a pointer to a stack frame.
|
||||
* @return the car of the indicated cell.
|
||||
* @exception if the pointer does not indicate a cons cell.
|
||||
*/
|
||||
struct pso_pointer car( struct pso_pointer frame_pointer ) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso_pointer cons = fetch_arg( pointer_to_pso4( frame_pointer), 0);
|
||||
struct pso2 *object = pointer_to_object( cons );
|
||||
struct pso_pointer car(struct pso_pointer frame_pointer) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso4 *frame = pointer_to_pso4(frame_pointer);
|
||||
struct pso_pointer cons = fetch_arg(frame, 0);
|
||||
struct pso2 *object = pointer_to_object(cons);
|
||||
|
||||
if ( consp( cons ) ) {
|
||||
result = object->payload.cons.car;
|
||||
} else {
|
||||
result =
|
||||
make_exception( make_frame( 2, frame_pointer,
|
||||
c_string_to_lisp_string( frame_pointer, L"Invalid type for car" ),
|
||||
make_cons(
|
||||
make_cons( frame_pointer,
|
||||
c_string_to_lisp_keyword( frame_pointer, L"type" ),
|
||||
get_tag_string( cons )), nil)));
|
||||
if (consp(cons)) {
|
||||
result = object->payload.cons.car;
|
||||
} else {
|
||||
result = make_exception(make_frame(
|
||||
2, frame_pointer,
|
||||
c_string_to_lisp_string(frame_pointer, L"Invalid type for car"),
|
||||
make_cons(frame_pointer, make_cons(
|
||||
frame_pointer,
|
||||
c_string_to_lisp_keyword(frame_pointer, L"type"),
|
||||
get_tag_string(cons)),
|
||||
nil)));
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the cdr of this cons (or other sequence) cell.
|
||||
*
|
||||
*
|
||||
* (cdr cell)
|
||||
*
|
||||
* @param frame_pointer a pointer to a stack frame.
|
||||
* @return the cdr of the indicated cell.
|
||||
* @exception if the pointer does not indicate a cons cell.
|
||||
*/
|
||||
struct pso_pointer cdr( struct pso_pointer frame_pointer ) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso4 *sp = pointer_to_pso4(frame_pointer);
|
||||
struct pso_pointer cons = fetch_arg(sp, 0);
|
||||
struct pso2 *object = pointer_to_object( cons );
|
||||
struct pso_pointer cdr(struct pso_pointer frame_pointer) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso4 *frame = pointer_to_pso4(frame_pointer);
|
||||
struct pso_pointer cons = fetch_arg(frame, 0);
|
||||
struct pso2 *object = pointer_to_object(cons);
|
||||
|
||||
switch ( get_tag_value( p ) ) {
|
||||
case CONSTV:
|
||||
result = object->payload.cons.cdr;
|
||||
break;
|
||||
case KEYTV:
|
||||
case STRINGTV:
|
||||
case SYMBOLTV:
|
||||
result = object->payload.string.cdr;
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
make_exception( make_frame( 2, frame_pointer,
|
||||
c_string_to_lisp_string( frame_pointer, L"Invalid type for cdr" ),
|
||||
make_cons(
|
||||
make_cons( frame_pointer,
|
||||
c_string_to_lisp_keyword( frame_pointer, L"type" ),
|
||||
get_tag_string( cons )), nil)));
|
||||
break;
|
||||
}
|
||||
switch (get_tag_value(cons)) {
|
||||
case CONSTV:
|
||||
result = object->payload.cons.cdr;
|
||||
break;
|
||||
case KEYTV:
|
||||
case STRINGTV:
|
||||
case SYMBOLTV:
|
||||
result = object->payload.string.cdr;
|
||||
break;
|
||||
default:
|
||||
struct pso_pointer type_binding =
|
||||
make_cons(frame_pointer,
|
||||
c_string_to_lisp_keyword(frame_pointer, L"type"),
|
||||
get_tag_string(cons));
|
||||
result = make_exception(make_frame(
|
||||
2, frame_pointer,
|
||||
c_string_to_lisp_string(frame_pointer, L"Invalid type for cdr"),
|
||||
make_cons(frame_pointer,
|
||||
type_binding,
|
||||
nil)));
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -121,12 +125,15 @@ struct pso_pointer cdr( struct pso_pointer frame_pointer ) {
|
|||
* Lisp calling conventions; one expected arg, the pointer to the cell to
|
||||
* be destroyed.
|
||||
*/
|
||||
struct pso_pointer destroy_cons( struct pso_pointer fp,
|
||||
struct pso_pointer env ) {
|
||||
if ( stackp( fp ) ) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp );
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
dec_ref( c_car( p ) );
|
||||
dec_ref( c_cdr( frame, p ) );
|
||||
}
|
||||
struct pso_pointer destroy_cons(struct pso_pointer fp) {
|
||||
if (stackp(fp)) {
|
||||
struct pso4 *frame = pointer_to_pso4(fp);
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
|
||||
if (check_tag(p, CONSTV)) {
|
||||
struct pso2 *cons = pointer_to_object(p);
|
||||
dec_ref(cons->payload.cons.car);
|
||||
dec_ref(cons->payload.cons.cdr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,24 @@ struct pso_pointer cdr( struct pso_pointer frame_pointer );
|
|||
|
||||
struct pso_pointer cons( struct pso_pointer frame_pointer );
|
||||
|
||||
struct pso_pointer destroy_cons( struct pso_pointer fp,
|
||||
struct pso_pointer env );
|
||||
struct pso_pointer destroy_cons( struct pso_pointer frame_pointer);
|
||||
|
||||
struct pso_pointer make_cons(struct pso_pointer frame_pointer,
|
||||
struct pso_pointer car,
|
||||
struct pso_pointer cdr);
|
||||
|
||||
/**
|
||||
* macro short-cuts for make_cons.
|
||||
*/
|
||||
// #define make_cons(frame_pointer,car,cdr) (cons(make_frame(2, frame_pointer, car, cdr)))
|
||||
|
||||
/**
|
||||
* Variant which assumes a convention that the frame pointer will always be
|
||||
* called `frame_pointer`
|
||||
*/
|
||||
#define make_cons2(car,cdr) (cons(make_frame(2, frame_pointer, car, cdr)))
|
||||
|
||||
#define c_car(p)(consp(p) ? pointer_to_object(p)->payload.cons.car : nil)
|
||||
#define c_cdr(p)(consp(p) ? pointer_to_object(p)->payload.cons.cdr : nil)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -6,6 +6,13 @@
|
|||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
|
||||
/*
|
||||
* wide characters
|
||||
*/
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
|
||||
|
||||
#include "memory/node.h"
|
||||
|
|
@ -17,7 +24,12 @@
|
|||
|
||||
#include "payloads/exception.h"
|
||||
|
||||
#include "ops/stack_ops.h"
|
||||
#include "ops/truth.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* @brief allocate an exception object, and, if successful, return a pointer
|
||||
|
|
@ -31,8 +43,7 @@
|
|||
* otherwise it will return a pointer to a new exception.
|
||||
*
|
||||
* @param message expected to be a string, but anything printable is accepted.
|
||||
* @param frame the stack frame in which the exception was `thrown`, if any.
|
||||
* @param meta metadata for this exception. Must be an assoc list, hashtable,
|
||||
b * @param meta metadata for this exception. Must be an assoc list, hashtable,
|
||||
* or `nil`
|
||||
* @param cause the exception that caused this exception to be `thrown`.
|
||||
*/
|
||||
|
|
@ -44,13 +55,13 @@ struct pso_pointer make_exception( struct pso_pointer frame_pointer) {
|
|||
struct pso_pointer cause = fetch_arg( frame, 2);
|
||||
|
||||
struct pso_pointer result =
|
||||
allocate( pointer_to_pso4( frame ), EXCEPTIONTAG, 3 );
|
||||
allocate( frame_pointer, EXCEPTIONTAG, 3 );
|
||||
|
||||
if ( !nilp( result ) && !exceptionp( result ) ) {
|
||||
if ( !c_nilp( result ) && !exceptionp( result ) ) {
|
||||
struct pso3 *object = ( struct pso3 * ) pointer_to_object( result );
|
||||
|
||||
object->payload.exception.message = message;
|
||||
object->payload.exception.stack = stackp( frame ) ? frame : nil;
|
||||
object->payload.exception.stack = stackp( frame_pointer ) ? frame_pointer : nil;
|
||||
object->payload.exception.meta = ( consp( meta )
|
||||
|| hashtabp( meta ) ) ? meta : nil;
|
||||
object->payload.exception.cause = exceptionp( cause ) ? cause : nil;
|
||||
|
|
|
|||
|
|
@ -26,10 +26,7 @@ struct exception_payload {
|
|||
struct pso_pointer cause;
|
||||
};
|
||||
|
||||
struct pso_pointer make_exception( struct pso_pointer message,
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer meta,
|
||||
struct pso_pointer cause );
|
||||
struct pso_pointer make_exception( struct pso_pointer frame_pointer );
|
||||
|
||||
struct pso_pointer destroy_exception( struct pso_pointer fp,
|
||||
struct pso_pointer env );
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
* @param more `nil`, or a pointer to the more significant cell(s) of this number.
|
||||
* *NOTE* that if `more` is not `nil`, `value` *must not* exceed `MAX_INTEGER`.
|
||||
*/
|
||||
struct pso_pointer make_integer( struct pso4 *frame_pointer, int64_t value ) {
|
||||
struct pso_pointer make_integer( struct pso_pointer frame_pointer, int64_t value ) {
|
||||
struct pso_pointer result = nil;
|
||||
debug_print( L"Entering make_integer\n", DEBUG_ALLOC, 0 );
|
||||
|
||||
|
|
|
|||
|
|
@ -25,6 +25,6 @@ struct integer_payload {
|
|||
__int128_t value;
|
||||
};
|
||||
|
||||
struct pso_pointer make_integer( struct pso4 *frame_pointer, int64_t value );
|
||||
struct pso_pointer make_integer( struct pso_pointer frame_pointer, int64_t value );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include "memory/node.h"
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
|
|
@ -34,8 +35,8 @@ struct pso_pointer destroy_string( struct pso_pointer fp,
|
|||
struct pso4 *frame = pointer_to_pso4( fp );
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
|
||||
dec_ref( c_cdr( frame, p ) );
|
||||
}
|
||||
dec_ref( c_cdr( p ) );
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
* @param metadata a pointer to an associaton containing metadata on the stream.
|
||||
* @return a pointer to the new read stream.
|
||||
*/
|
||||
struct pso_pointer make_read_stream( struct pso4 *frame_pointer,
|
||||
struct pso_pointer make_read_stream( struct pso_pointer frame_pointer,
|
||||
URL_FILE *input,
|
||||
struct pso_pointer metadata ) {
|
||||
struct pso_pointer pointer = allocate( frame_pointer, READTAG, 2 );
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ struct stream_payload {
|
|||
struct pso_pointer meta;
|
||||
};
|
||||
|
||||
struct pso_pointer make_read_stream( struct pso4 *frame_pointer,
|
||||
struct pso_pointer make_read_stream( struct pso_pointer frame_pointer,
|
||||
URL_FILE * input,
|
||||
struct pso_pointer metadata );
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* payloads/stack.h
|
||||
* payloads/stack.c
|
||||
*
|
||||
* a Lisp stack frame.
|
||||
*
|
||||
|
|
@ -23,6 +23,7 @@
|
|||
#include "payloads/cons.h"
|
||||
|
||||
#include "ops/reverse.h"
|
||||
#include "ops/list_ops.h"
|
||||
|
||||
/**
|
||||
* @brief Construct a stack frame with this `previous` pointer, and arguments
|
||||
|
|
@ -43,7 +44,7 @@ struct pso_pointer make_frame( int arg_count, struct pso_pointer previous,
|
|||
|
||||
struct pso4 *prev_frame = pointer_to_pso4( previous );
|
||||
struct pso_pointer new_pointer =
|
||||
allocate( pointer_to_pso4( previous ), STACKTAG, 4 );
|
||||
allocate( previous, STACKTAG, 4 );
|
||||
struct pso4* new_frame = pointer_to_pso4(new_pointer);
|
||||
|
||||
#ifdef DEBUG
|
||||
|
|
@ -78,7 +79,7 @@ struct pso_pointer make_frame( int arg_count, struct pso_pointer previous,
|
|||
|
||||
for ( ; cursor < arg_count; cursor++ ) {
|
||||
more_args =
|
||||
make_cons( prev_frame, va_arg( args, struct pso_pointer ),
|
||||
make_cons( previous, va_arg( args, struct pso_pointer ),
|
||||
more_args );
|
||||
}
|
||||
|
||||
|
|
@ -117,7 +118,7 @@ struct pso_pointer make_frame_with_env( int arg_count,
|
|||
|
||||
struct pso4 *prev_frame = pointer_to_pso4( previous );
|
||||
struct pso_pointer new_pointer =
|
||||
allocate( pointer_to_pso4( previous ), STACKTAG, 4 );
|
||||
allocate( previous, STACKTAG, 4 );
|
||||
struct pso4* new_frame = pointer_to_pso4(new_pointer);
|
||||
|
||||
#ifdef DEBUG
|
||||
|
|
@ -152,7 +153,7 @@ struct pso_pointer make_frame_with_env( int arg_count,
|
|||
|
||||
for ( ; cursor < arg_count; cursor++ ) {
|
||||
more_args =
|
||||
make_cons( prev_frame, va_arg( args, struct pso_pointer ),
|
||||
make_cons( previous, va_arg( args, struct pso_pointer ),
|
||||
more_args );
|
||||
}
|
||||
|
||||
|
|
@ -184,10 +185,10 @@ struct pso_pointer make_frame_with_arglist_and_env( struct pso_pointer previous,
|
|||
struct pso_pointer env) {
|
||||
struct pso4 *prev_frame = pointer_to_pso4( previous );
|
||||
struct pso_pointer new_pointer =
|
||||
allocate( pointer_to_pso4( previous ), STACKTAG, 4 );
|
||||
allocate( previous, STACKTAG, 4 );
|
||||
struct pso4* new_frame = pointer_to_pso4(new_pointer);
|
||||
int arg_count = c_length(argvalues);
|
||||
|
||||
struct pso_pointer arg_length = length(make_frame(1, previous, argvalues));
|
||||
int arg_count = integerp(arg_length) ? pointer_to_object(arg_length)->payload.integer.value : 0;
|
||||
#ifdef DEBUG
|
||||
debug_printf( DEBUG_ALLOC, 0,
|
||||
L"\nAllocating stack frame with %d arguments at page %d, "
|
||||
|
|
@ -216,7 +217,7 @@ struct pso_pointer make_frame_with_arglist_and_env( struct pso_pointer previous,
|
|||
argvalues = cdr( make_frame( 1, previous, argvalues));
|
||||
}
|
||||
if ( cursor < arg_count ) {
|
||||
new_frame->payload.stack_frame.more = inc_ref( cursor);
|
||||
new_frame->payload.stack_frame.more = inc_ref( argvalues);
|
||||
} else {
|
||||
for ( ; cursor < args_in_frame; cursor++ ) {
|
||||
new_frame->payload.stack_frame.arg[cursor] = nil;
|
||||
|
|
|
|||
|
|
@ -43,9 +43,18 @@ struct stack_frame_payload {
|
|||
|
||||
struct pso_pointer make_frame( int arg_count, struct pso_pointer previous,
|
||||
... );
|
||||
|
||||
struct pso_pointer make_frame_with_env( int arg_count,
|
||||
struct pso_pointer previous,
|
||||
struct pso_pointer env, ... )
|
||||
struct pso_pointer env, ... );
|
||||
|
||||
struct pso_pointer make_frame_with_arglist_and_env( struct pso_pointer previous,
|
||||
struct pso_pointer argvalues,
|
||||
struct pso_pointer env);
|
||||
|
||||
struct pso_pointer make_frame_with_arglist( struct pso_pointer previous,
|
||||
struct pso_pointer argvalues);
|
||||
|
||||
struct pso_pointer destroy_stack_frame( struct pso_pointer fp,
|
||||
struct pso_pointer env );
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
* @param metadata a pointer to an associaton containing metadata on the stream.
|
||||
* @return a pointer to the new read stream.
|
||||
*/
|
||||
struct pso_pointer make_write_stream( struct pso4 *frame_pointer,
|
||||
struct pso_pointer make_write_stream( struct pso_pointer frame_pointer,
|
||||
URL_FILE *output,
|
||||
struct pso_pointer metadata ) {
|
||||
struct pso_pointer pointer = allocate( frame_pointer, WRITETAG, 2 );
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
/* write stream shares a payload with /see read_streem.h */
|
||||
|
||||
#include "io/fopen.h"
|
||||
struct pso_pointer make_write_stream( struct pso4 *frame_pointer,
|
||||
struct pso_pointer make_write_stream( struct pso_pointer frame_pointer,
|
||||
URL_FILE * output,
|
||||
struct pso_pointer metadata );
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue