parent
f3a26bc02e
commit
b6480aebd5
53 changed files with 590 additions and 520 deletions
|
|
@ -35,31 +35,41 @@
|
|||
* @return a sequence like the `sequence` passed, but reversed; or `nil` if
|
||||
* the argument was not a sequence.
|
||||
*/
|
||||
struct pso_pointer reverse( struct pso_pointer sequence) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso_pointer reverse( struct pso_pointer sequence ) {
|
||||
struct pso_pointer result = nil;
|
||||
|
||||
for (struct pso_pointer cursor = sequence; !nilp( sequence); cursor = cdr(cursor)) {
|
||||
struct pso2* object = pointer_to_object( cursor);
|
||||
switch (get_tag_value(cursor)) {
|
||||
case CONSTV :
|
||||
result = cons( car(cursor), result);
|
||||
break;
|
||||
case KEYTV :
|
||||
result = make_string_like_thing( object->payload.string.character, result, KEYTAG);
|
||||
break;
|
||||
case STRINGTV :
|
||||
result = make_string_like_thing( object->payload.string.character, result, STRINGTAG);
|
||||
break;
|
||||
case SYMBOLTV :
|
||||
result = make_string_like_thing( object->payload.string.character, result, SYMBOLTAG);
|
||||
break;
|
||||
default :
|
||||
result = make_exception( c_string_to_lisp_string(L"Invalid object in sequence"), nil, nil);
|
||||
goto exit;
|
||||
break;
|
||||
}
|
||||
}
|
||||
exit:
|
||||
for ( struct pso_pointer cursor = sequence; !nilp( sequence );
|
||||
cursor = cdr( cursor ) ) {
|
||||
struct pso2 *object = pointer_to_object( cursor );
|
||||
switch ( get_tag_value( cursor ) ) {
|
||||
case CONSTV:
|
||||
result = cons( car( cursor ), result );
|
||||
break;
|
||||
case KEYTV:
|
||||
result =
|
||||
make_string_like_thing( object->payload.string.character,
|
||||
result, KEYTAG );
|
||||
break;
|
||||
case STRINGTV:
|
||||
result =
|
||||
make_string_like_thing( object->payload.string.character,
|
||||
result, STRINGTAG );
|
||||
break;
|
||||
case SYMBOLTV:
|
||||
result =
|
||||
make_string_like_thing( object->payload.string.character,
|
||||
result, SYMBOLTAG );
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
make_exception( c_string_to_lisp_string
|
||||
( L"Invalid object in sequence" ), nil,
|
||||
nil );
|
||||
goto exit;
|
||||
break;
|
||||
}
|
||||
}
|
||||
exit:
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue