Reorganised source files to make navigation easier
All tests still pass (slightly to my surprise)
This commit is contained in:
parent
f6ff403249
commit
a5e1d3ccd8
|
@ -132,10 +132,10 @@ struct cons_pointer simplify_ratio( struct stack_frame *frame,
|
||||||
struct cons_pointer arg ) {
|
struct cons_pointer arg ) {
|
||||||
struct cons_pointer result = arg;
|
struct cons_pointer result = arg;
|
||||||
long int ddrv =
|
long int ddrv =
|
||||||
pointer2cell( pointer2cell( arg ).payload.ratio.dividend ).payload.
|
pointer2cell( pointer2cell( arg ).payload.ratio.dividend ).
|
||||||
integer.value, drrv =
|
payload.integer.value, drrv =
|
||||||
pointer2cell( pointer2cell( arg ).payload.ratio.divisor ).payload.
|
pointer2cell( pointer2cell( arg ).payload.ratio.divisor ).
|
||||||
integer.value, gcd = greatest_common_divisor( ddrv, drrv );
|
payload.integer.value, gcd = greatest_common_divisor( ddrv, drrv );
|
||||||
|
|
||||||
if ( gcd > 1 ) {
|
if ( gcd > 1 ) {
|
||||||
if ( drrv / gcd == 1 ) {
|
if ( drrv / gcd == 1 ) {
|
||||||
|
@ -181,8 +181,8 @@ struct cons_pointer add_ratio_ratio( struct stack_frame *frame,
|
||||||
|
|
||||||
if ( dr1v == dr2v ) {
|
if ( dr1v == dr2v ) {
|
||||||
r = make_ratio( frame,
|
r = make_ratio( frame,
|
||||||
make_integer( dd1v + dd2v ),
|
make_integer( dd1v + dd2v ),
|
||||||
cell1.payload.ratio.divisor );
|
cell1.payload.ratio.divisor );
|
||||||
} else {
|
} else {
|
||||||
struct cons_pointer dd1vm = make_integer( dd1v * m1 ),
|
struct cons_pointer dd1vm = make_integer( dd1v * m1 ),
|
||||||
dr1vm = make_integer( dr1v * m1 ),
|
dr1vm = make_integer( dr1v * m1 ),
|
||||||
|
@ -404,8 +404,8 @@ struct cons_pointer multiply_integer_ratio( struct stack_frame *frame,
|
||||||
ratio = make_ratio( frame, intarg, one ),
|
ratio = make_ratio( frame, intarg, one ),
|
||||||
result = multiply_ratio_ratio( frame, ratio, ratarg );
|
result = multiply_ratio_ratio( frame, ratio, ratarg );
|
||||||
|
|
||||||
dec_ref( one);
|
dec_ref( one );
|
||||||
dec_ref( ratio);
|
dec_ref( ratio );
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -561,8 +561,8 @@ struct cons_pointer inverse( struct stack_frame *frame,
|
||||||
case RATIOTV:
|
case RATIOTV:
|
||||||
result = make_ratio( frame,
|
result = make_ratio( frame,
|
||||||
make_integer( 0 -
|
make_integer( 0 -
|
||||||
to_long_int( cell.payload.ratio.
|
to_long_int( cell.payload.
|
||||||
dividend ) ),
|
ratio.dividend ) ),
|
||||||
cell.payload.ratio.divisor );
|
cell.payload.ratio.divisor );
|
||||||
break;
|
break;
|
||||||
case REALTV:
|
case REALTV:
|
||||||
|
@ -692,10 +692,10 @@ struct cons_pointer divide_ratio_ratio( struct stack_frame *frame,
|
||||||
struct cons_pointer arg1,
|
struct cons_pointer arg1,
|
||||||
struct cons_pointer arg2 ) {
|
struct cons_pointer arg2 ) {
|
||||||
struct cons_pointer i = make_ratio( frame,
|
struct cons_pointer i = make_ratio( frame,
|
||||||
pointer2cell( arg2 ).payload.ratio.
|
pointer2cell( arg2 ).payload.
|
||||||
divisor,
|
ratio.divisor,
|
||||||
pointer2cell( arg2 ).payload.ratio.
|
pointer2cell( arg2 ).payload.
|
||||||
dividend ), result =
|
ratio.dividend ), result =
|
||||||
multiply_ratio_ratio( frame, arg1, i );
|
multiply_ratio_ratio( frame, arg1, i );
|
||||||
|
|
||||||
dec_ref( i );
|
dec_ref( i );
|
||||||
|
@ -726,22 +726,23 @@ struct cons_pointer lisp_divide( struct
|
||||||
case EXCEPTIONTV:
|
case EXCEPTIONTV:
|
||||||
result = frame->arg[1];
|
result = frame->arg[1];
|
||||||
break;
|
break;
|
||||||
case INTEGERTV: {
|
case INTEGERTV:{
|
||||||
struct cons_pointer unsimplified = make_ratio( frame, frame->arg[0], frame->arg[1] );
|
struct cons_pointer unsimplified =
|
||||||
result = simplify_ratio(frame, unsimplified);
|
make_ratio( frame, frame->arg[0], frame->arg[1] );
|
||||||
if (!eq(unsimplified,result)){
|
result = simplify_ratio( frame, unsimplified );
|
||||||
dec_ref(unsimplified);
|
if ( !eq( unsimplified, result ) ) {
|
||||||
}
|
dec_ref( unsimplified );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case RATIOTV: {
|
case RATIOTV:{
|
||||||
struct cons_pointer one = make_integer( 1 );
|
struct cons_pointer one = make_integer( 1 );
|
||||||
struct cons_pointer ratio =
|
struct cons_pointer ratio =
|
||||||
make_ratio( frame, frame->arg[0], one );
|
make_ratio( frame, frame->arg[0], one );
|
||||||
result =
|
result =
|
||||||
divide_ratio_ratio( frame, ratio, frame->arg[1] );
|
divide_ratio_ratio( frame, ratio, frame->arg[1] );
|
||||||
dec_ref( ratio );
|
dec_ref( ratio );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REALTV:
|
case REALTV:
|
||||||
result =
|
result =
|
||||||
|
@ -760,13 +761,14 @@ struct cons_pointer lisp_divide( struct
|
||||||
case EXCEPTIONTV:
|
case EXCEPTIONTV:
|
||||||
result = frame->arg[1];
|
result = frame->arg[1];
|
||||||
break;
|
break;
|
||||||
case INTEGERTV: {
|
case INTEGERTV:{
|
||||||
struct cons_pointer one = make_integer( 1 );
|
struct cons_pointer one = make_integer( 1 );
|
||||||
struct cons_pointer ratio =
|
struct cons_pointer ratio =
|
||||||
make_ratio( frame, frame->arg[1], one );
|
make_ratio( frame, frame->arg[1], one );
|
||||||
result = divide_ratio_ratio( frame, frame->arg[0], ratio );
|
result =
|
||||||
dec_ref( ratio );
|
divide_ratio_ratio( frame, frame->arg[0], ratio );
|
||||||
}
|
dec_ref( ratio );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case RATIOTV:
|
case RATIOTV:
|
||||||
result =
|
result =
|
|
@ -159,13 +159,14 @@ void free_cell( struct cons_pointer pointer ) {
|
||||||
case SYMBOLTV:
|
case SYMBOLTV:
|
||||||
dec_ref( cell->payload.string.cdr );
|
dec_ref( cell->payload.string.cdr );
|
||||||
break;
|
break;
|
||||||
case VECTORPOINTTV:
|
case VECTORPOINTTV:
|
||||||
/* for vector space pointers, free the actual vector-space
|
/* for vector space pointers, free the actual vector-space
|
||||||
* object. Dangerous! */
|
* object. Dangerous! */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fwprintf(stderr, L"About to free vector-space object at %ld\n", cell->payload.vectorp.address);
|
fwprintf( stderr, L"About to free vector-space object at %ld\n",
|
||||||
|
cell->payload.vectorp.address );
|
||||||
#endif
|
#endif
|
||||||
free( (void *)cell->payload.vectorp.address);
|
free( ( void * ) cell->payload.vectorp.address );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
|
@ -136,10 +136,10 @@ void dump_object( FILE * output, struct cons_pointer pointer ) {
|
||||||
case RATIOTV:
|
case RATIOTV:
|
||||||
fwprintf( output,
|
fwprintf( output,
|
||||||
L"\t\tRational cell: value %ld/%ld, count %u\n",
|
L"\t\tRational cell: value %ld/%ld, count %u\n",
|
||||||
pointer2cell( cell.payload.ratio.dividend ).payload.
|
pointer2cell( cell.payload.ratio.dividend ).
|
||||||
integer.value,
|
payload.integer.value,
|
||||||
pointer2cell( cell.payload.ratio.divisor ).payload.
|
pointer2cell( cell.payload.ratio.divisor ).
|
||||||
integer.value, cell.count );
|
payload.integer.value, cell.count );
|
||||||
break;
|
break;
|
||||||
case READTV:
|
case READTV:
|
||||||
fwprintf( output, L"\t\tInput stream\n" );
|
fwprintf( output, L"\t\tInput stream\n" );
|
|
@ -29,14 +29,14 @@
|
||||||
* NOTE that `tag` should be the vector-space tag of the particular type of
|
* NOTE that `tag` should be the vector-space tag of the particular type of
|
||||||
* vector-space object, NOT `VECTORPOINTTAG`.
|
* vector-space object, NOT `VECTORPOINTTAG`.
|
||||||
*/
|
*/
|
||||||
struct cons_pointer make_vec_pointer(char *tag, uint64_t address) {
|
struct cons_pointer make_vec_pointer( char *tag, uint64_t address ) {
|
||||||
struct cons_pointer pointer = allocate_cell( VECTORPOINTTAG );
|
struct cons_pointer pointer = allocate_cell( VECTORPOINTTAG );
|
||||||
struct cons_space_object cell = pointer2cell( pointer );
|
struct cons_space_object cell = pointer2cell( pointer );
|
||||||
|
|
||||||
strncpy( &cell.payload.vectorp.tag.bytes[0], tag, 4 );
|
strncpy( &cell.payload.vectorp.tag.bytes[0], tag, 4 );
|
||||||
cell.payload.vectorp.address = address;
|
cell.payload.vectorp.address = address;
|
||||||
|
|
||||||
return pointer;
|
return pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,25 +45,25 @@ struct cons_pointer make_vec_pointer(char *tag, uint64_t address) {
|
||||||
* NOTE that `tag` should be the vector-space tag of the particular type of
|
* NOTE that `tag` should be the vector-space tag of the particular type of
|
||||||
* vector-space object, NOT `VECTORPOINTTAG`.
|
* vector-space object, NOT `VECTORPOINTTAG`.
|
||||||
*/
|
*/
|
||||||
struct cons_pointer make_vso( char *tag, long int payload_size) {
|
struct cons_pointer make_vso( char *tag, long int payload_size ) {
|
||||||
struct cons_pointer result = NIL;
|
struct cons_pointer result = NIL;
|
||||||
long int total_size = sizeof(struct vector_space_header) + payload_size;
|
long int total_size = sizeof( struct vector_space_header ) + payload_size;
|
||||||
|
|
||||||
struct vector_space_header *vso = malloc(total_size );
|
struct vector_space_header *vso = malloc( total_size );
|
||||||
|
|
||||||
if (vso != NULL) {
|
if ( vso != NULL ) {
|
||||||
strncpy( vso->tag.bytes[0], tag, TAGLENGTH );
|
strncpy( &vso->tag.bytes[0], tag, TAGLENGTH );
|
||||||
vso->vecp = make_vec_pointer(tag, (uint64_t)vso);
|
vso->vecp = make_vec_pointer( tag, ( uint64_t ) vso );
|
||||||
vso->size = payload_size;
|
vso->size = payload_size;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fwprintf(stderr, L"Allocated vector-space object of type %s, total size %ld, payload size %ld\n",
|
fwprintf( stderr,
|
||||||
tag, total_size, payload_size);
|
L"Allocated vector-space object of type %s, total size %ld, payload size %ld\n",
|
||||||
|
tag, total_size, payload_size );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
result = vso->vecp;
|
result = vso->vecp;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,10 +42,10 @@
|
||||||
|
|
||||||
#define pointer_to_vso(pointer)(vectorpointp(pointer)? pointer2cell(pointer).payload.vectorp.address : 0)
|
#define pointer_to_vso(pointer)(vectorpointp(pointer)? pointer2cell(pointer).payload.vectorp.address : 0)
|
||||||
|
|
||||||
struct cons_pointer make_vso( char *tag, long int payload_size);
|
struct cons_pointer make_vso( char *tag, long int payload_size );
|
||||||
|
|
||||||
struct vector_space_header {
|
struct vector_space_header {
|
||||||
union {
|
union {
|
||||||
char bytes[TAGLENGTH]; /* the tag (type) of the
|
char bytes[TAGLENGTH]; /* the tag (type) of the
|
||||||
* vector-space object this cell
|
* vector-space object this cell
|
||||||
* points to, considered as bytes.
|
* points to, considered as bytes.
|
||||||
|
@ -56,15 +56,13 @@ struct vector_space_header {
|
||||||
} tag;
|
} tag;
|
||||||
struct cons_pointer vecp; /* back pointer to the vector pointer
|
struct cons_pointer vecp; /* back pointer to the vector pointer
|
||||||
* which uniquely points to this vso */
|
* which uniquely points to this vso */
|
||||||
uint64_t size; /* the size of my payload, in bytes */
|
uint64_t size; /* the size of my payload, in bytes */
|
||||||
char mark; /* mark bit for marking/sweeping the
|
char mark; /* mark bit for marking/sweeping the
|
||||||
* heap (not in this version) */
|
* heap (not in this version) */
|
||||||
char payload; /* we'll malloc `size` bytes for payload,
|
char payload; /* we'll malloc `size` bytes for payload,
|
||||||
* `payload` is just the first of these.
|
* `payload` is just the first of these.
|
||||||
* TODO: this is almost certainly not
|
* TODO: this is almost certainly not
|
||||||
* idiomatic C. */
|
* idiomatic C. */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -80,8 +80,8 @@ bool equal( struct cons_pointer a, struct cons_pointer b ) {
|
||||||
&& ( equal( cell_a->payload.string.cdr,
|
&& ( equal( cell_a->payload.string.cdr,
|
||||||
cell_b->payload.string.cdr )
|
cell_b->payload.string.cdr )
|
||||||
|| ( end_of_string( cell_a->payload.string.cdr )
|
|| ( end_of_string( cell_a->payload.string.cdr )
|
||||||
&& end_of_string( cell_b->payload.string.
|
&& end_of_string( cell_b->payload.
|
||||||
cdr ) ) );
|
string.cdr ) ) );
|
||||||
break;
|
break;
|
||||||
case INTEGERTV:
|
case INTEGERTV:
|
||||||
result =
|
result =
|
|
@ -132,8 +132,8 @@ struct cons_pointer print( FILE * output, struct cons_pointer pointer ) {
|
||||||
case LAMBDATV:
|
case LAMBDATV:
|
||||||
print( output, make_cons( c_string_to_lisp_symbol( "lambda" ),
|
print( output, make_cons( c_string_to_lisp_symbol( "lambda" ),
|
||||||
make_cons( cell.payload.lambda.args,
|
make_cons( cell.payload.lambda.args,
|
||||||
cell.payload.
|
cell.payload.lambda.
|
||||||
lambda.body ) ) );
|
body ) ) );
|
||||||
break;
|
break;
|
||||||
case NILTV:
|
case NILTV:
|
||||||
fwprintf( output, L"nil" );
|
fwprintf( output, L"nil" );
|
||||||
|
@ -141,8 +141,8 @@ struct cons_pointer print( FILE * output, struct cons_pointer pointer ) {
|
||||||
case NLAMBDATV:
|
case NLAMBDATV:
|
||||||
print( output, make_cons( c_string_to_lisp_symbol( "nlambda" ),
|
print( output, make_cons( c_string_to_lisp_symbol( "nlambda" ),
|
||||||
make_cons( cell.payload.lambda.args,
|
make_cons( cell.payload.lambda.args,
|
||||||
cell.payload.
|
cell.payload.lambda.
|
||||||
lambda.body ) ) );
|
body ) ) );
|
||||||
break;
|
break;
|
||||||
case RATIOTV:
|
case RATIOTV:
|
||||||
print( output, cell.payload.ratio.dividend );
|
print( output, cell.payload.ratio.dividend );
|
Loading…
Reference in a new issue