Well, we have a REPL. It blows up horribly, but we have one.
This commit is contained in:
parent
4efe9eab87
commit
cf05e30540
19 changed files with 422 additions and 144 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue