Well, we have a REPL. It blows up horribly, but we have one.

This commit is contained in:
Simon Brooke 2026-04-17 14:20:31 +01:00
parent 4efe9eab87
commit cf05e30540
19 changed files with 422 additions and 144 deletions

View file

@ -32,6 +32,7 @@
#include "memory/pso2.h"
#include "memory/tags.h"
#include "payloads/function.h"
#include "payloads/integer.h"
#include "payloads/read_stream.h"
@ -41,7 +42,7 @@
#include "ops/string_ops.h"
#include "ops/truth.h"
// TODO: what I've copied from 0.0.6 is *wierdly* over-complex for just now.
// TODO: what I've copied from 0.0.6 is *weirdly* over-complex for just now.
// I think I'm going to essentially delete all this and start again. We need
// to be able to despatch on readttables, and the initial readtable functions
// don't need to be written in Lisp.
@ -55,9 +56,9 @@
// the next is the input stream; the next is the readtable, if any.
/*
* for the time being things which may be read are:
* for the time being things which may be read are:
* * integers
* * lists
* * lists
* * atoms
* * dotted pairs
*/
@ -72,8 +73,12 @@
* 1. The read table currently in use;
* 2. The character most recently read from that stream.
*/
struct pso_pointer read_example( struct pso_pointer frame_pointer,
struct pso_pointer env ) {
struct pso_pointer read_example(
#ifndef MANAGED_POINTER_ONLY
struct pso4 *frame,
#endif
struct pso_pointer frame_pointer,
struct pso_pointer env ) {
struct pso4 *frame = pointer_to_pso4( frame_pointer );
struct pso_pointer stream = fetch_arg( frame, 0 );
struct pso_pointer readtable = fetch_arg( frame, 1 );
@ -93,8 +98,12 @@ struct pso_pointer read_example( struct pso_pointer frame_pointer,
* 1. The read table currently in use;
* 2. The character most recently read from that stream.
*/
struct pso_pointer read_number( struct pso_pointer frame_pointer,
struct pso_pointer env ) {
struct pso_pointer read_number(
#ifndef MANAGED_POINTER_ONLY
struct pso4 *frame,
#endif
struct pso_pointer frame_pointer,
struct pso_pointer env ) {
struct pso4 *frame = pointer_to_pso4( frame_pointer );
struct pso_pointer stream = fetch_arg( frame, 0 );
struct pso_pointer readtable = fetch_arg( frame, 1 );
@ -109,8 +118,8 @@ struct pso_pointer read_number( struct pso_pointer frame_pointer,
if ( nilp( character ) ) {
character = get_character( stream );
}
wchar_t c = nilp( character ) ? 0 :
pointer_to_object( character )->payload.character.character;
wchar_t c = nilp( character )
? 0 : pointer_to_object( character )->payload.character.character;
URL_FILE *input = pointer_to_object( stream )->payload.stream.stream;
for ( ; iswdigit( c ); c = url_fgetwc( input ) ) {
@ -124,8 +133,12 @@ struct pso_pointer read_number( struct pso_pointer frame_pointer,
return result;
}
struct pso_pointer read_symbol( struct pso_pointer frame_pointer,
struct pso_pointer env ) {
struct pso_pointer read_symbol(
#ifndef MANAGED_POINTER_ONLY
struct pso4 *frame,
#endif
struct pso_pointer frame_pointer,
struct pso_pointer env ) {
struct pso4 *frame = pointer_to_pso4( frame_pointer );
struct pso_pointer stream = fetch_arg( frame, 0 );
struct pso_pointer readtable = fetch_arg( frame, 1 );
@ -137,8 +150,8 @@ struct pso_pointer read_symbol( struct pso_pointer frame_pointer,
character = get_character( stream );
}
wchar_t c = nilp( character ) ? 0 :
pointer_to_object( character )->payload.character.character;
wchar_t c = nilp( character )
? 0 : pointer_to_object( character )->payload.character.character;
URL_FILE *input = pointer_to_object( stream )->payload.stream.stream;
for ( ; iswalnum( c ); c = url_fgetwc( input ) ) {
@ -163,8 +176,12 @@ struct pso_pointer read_symbol( struct pso_pointer frame_pointer,
* 1. The read table currently in use;
* 2. The character most recently read from that stream.
*/
struct pso_pointer read( struct pso_pointer frame_pointer,
struct pso_pointer env ) {
struct pso_pointer read(
#ifndef MANAGED_POINTER_ONLY
struct pso4 *frame,
#endif
struct pso_pointer frame_pointer,
struct pso_pointer env ) {
struct pso4 *frame = pointer_to_pso4( frame_pointer );
struct pso_pointer stream = fetch_arg( frame, 0 );
struct pso_pointer readtable = fetch_arg( frame, 1 );
@ -201,27 +218,38 @@ struct pso_pointer read( struct pso_pointer frame_pointer,
/* skip all characters from semi-colon to the end of the line */
break;
case EOF:
// result = throw_exception( c_string_to_lisp_symbol( L"read" ),
// c_string_to_lisp_string
// ( L"End of input while reading" ),
// frame_pointer );
// result = throw_exception( c_string_to_lisp_symbol(
// L"read" ),
// c_string_to_lisp_string
// ( L"End of input while
// reading" ),
// frame_pointer );
break;
default:
struct pso_pointer next =
make_frame( 3, frame_pointer, stream, readtable,
make_character( c ) );
struct pso_pointer next = make_frame( 3, frame_pointer, stream,
readtable,
make_character( c ) );
inc_ref( next );
if ( iswdigit( c ) ) {
result = read_number( next, env );
} else if ( iswalpha( c ) ) {
result = read_symbol( next, env );
} else {
// result =
// throw_exception( c_string_to_lisp_symbol( L"read" ),
// make_cons( c_string_to_lisp_string
// ( L"Unrecognised start of input character" ),
// make_string( c, NIL ) ),
// frame_pointer );
// result =
// throw_exception(
// c_string_to_lisp_symbol( L"read" ),
// make_cons(
// c_string_to_lisp_string
// (
// L"Unrecognised
// start of
// input
// character"
// ),
// make_string(
// c, NIL )
// ),
// frame_pointer );
}
dec_ref( next );
break;