Working on eval/apply. Unfinished, does not build. More significantly,
as the focus ot this prototype is supposed to be building things in Lisp, I've started deliberately copying stuff that mostly works directly from the 0.0.6 branch into this branch. After all, if it's going to be replaced in Lisp, it doesn't have to be the most elegant C.
This commit is contained in:
parent
63906fe817
commit
f7eabb9b62
10 changed files with 1730 additions and 134 deletions
|
|
@ -16,8 +16,10 @@
|
|||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "ops/stack_ops.h"
|
||||
#include "payloads/cons.h"
|
||||
#include "payloads/exception.h"
|
||||
#include "payloads/psse_string.h"
|
||||
|
|
@ -25,6 +27,63 @@
|
|||
#include "ops/string_ops.h"
|
||||
#include "ops/truth.h"
|
||||
|
||||
|
||||
struct pso_pointer reverse( struct pso_pointer frame_pointer ) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso_pointer sequence =
|
||||
fetch_arg( pointer_to_pso4( frame_pointer ), 0 );
|
||||
for ( struct pso_pointer cursor = sequence; !c_nilp( sequence );
|
||||
cursor = c_cdr( cursor ) ) {
|
||||
struct pso2 *object = pointer_to_object( cursor );
|
||||
switch ( get_tag_value( cursor ) ) {
|
||||
case CONSTV:
|
||||
result = push_local( frame_pointer,
|
||||
make_cons( frame_pointer, c_car( cursor ),
|
||||
result ) );
|
||||
break;
|
||||
case KEYTV:
|
||||
result = push_local( frame_pointer,
|
||||
make_string_like_thing( frame_pointer,
|
||||
object->payload.
|
||||
string.character,
|
||||
result,
|
||||
KEYTAG ) );
|
||||
break;
|
||||
case STRINGTV:
|
||||
result = push_local( frame_pointer,
|
||||
make_string_like_thing( frame_pointer,
|
||||
object->payload.
|
||||
string.character,
|
||||
result,
|
||||
STRINGTAG ) );
|
||||
break;
|
||||
case SYMBOLTV:
|
||||
result = push_local( frame_pointer,
|
||||
make_string_like_thing( frame_pointer,
|
||||
object->payload.
|
||||
string.character,
|
||||
result,
|
||||
SYMBOLTAG ) );
|
||||
break;
|
||||
default:
|
||||
result = push_local( frame_pointer,
|
||||
make_exception( make_frame
|
||||
( 1, frame_pointer,
|
||||
make_cons
|
||||
( frame_pointer,
|
||||
c_string_to_lisp_string
|
||||
( frame_pointer,
|
||||
L"Invalid object in sequence" ),
|
||||
cursor ) ) ) );
|
||||
goto exit;
|
||||
break;
|
||||
}
|
||||
}
|
||||
exit:
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief reverse a sequence.
|
||||
*
|
||||
|
|
@ -37,49 +96,11 @@
|
|||
*/
|
||||
struct pso_pointer c_reverse( struct pso_pointer frame_pointer,
|
||||
struct pso_pointer sequence ) {
|
||||
// todo: issue #21: must have stack frame passed in.
|
||||
|
||||
struct pso_pointer result = nil;
|
||||
|
||||
for ( struct pso_pointer cursor = sequence; !c_nilp( sequence );
|
||||
cursor = c_cdr( cursor ) ) {
|
||||
struct pso2 *object = pointer_to_object( cursor );
|
||||
switch ( get_tag_value( cursor ) ) {
|
||||
case CONSTV:
|
||||
result = make_cons( frame_pointer, c_car( cursor ), result );
|
||||
break;
|
||||
case KEYTV:
|
||||
// TODO: should you be able to reverse keywords and symbols?
|
||||
result =
|
||||
make_string_like_thing( frame_pointer,
|
||||
object->payload.string.character,
|
||||
result, KEYTAG );
|
||||
break;
|
||||
case STRINGTV:
|
||||
result =
|
||||
make_string_like_thing( frame_pointer,
|
||||
object->payload.string.character,
|
||||
result, STRINGTAG );
|
||||
break;
|
||||
case SYMBOLTV:
|
||||
// TODO: should you be able to reverse keywords and symbols?
|
||||
result =
|
||||
make_string_like_thing( frame_pointer,
|
||||
object->payload.string.character,
|
||||
result, SYMBOLTAG );
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
make_exception( make_frame( 1, frame_pointer,
|
||||
make_cons( frame_pointer,
|
||||
c_string_to_lisp_string
|
||||
( frame_pointer,
|
||||
L"Invalid object in sequence" ),
|
||||
cursor ) ) );
|
||||
goto exit;
|
||||
break;
|
||||
}
|
||||
if ( stackp( frame_pointer ) ) {
|
||||
result = reverse( frame_pointer );
|
||||
}
|
||||
exit:
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue