Author: bernhard
Date: Sun Nov  4 03:42:56 2007
New Revision: 22693

Modified:
   trunk/languages/scheme/lib/Scheme/Generator.pm
   trunk/languages/scheme/lib/Scheme/Parser.pm

Log:
[Scheme]
Add support for empty lists.
Back to two failures.


Modified: trunk/languages/scheme/lib/Scheme/Generator.pm
==============================================================================
--- trunk/languages/scheme/lib/Scheme/Generator.pm      (original)
+++ trunk/languages/scheme/lib/Scheme/Generator.pm      Sun Nov  4 03:42:56 2007
@@ -218,10 +218,13 @@
 sub _constant {
     my ( $self, $value ) = @_;
 
-    $self->_add_comment( 'start of _constant' );
-    my ( $reg_type, $pmc_type );
+    $self->_add_comment( 'start of _constant()' );
+    my ( $pmc_type );
 
-    if ( $value =~ m/ \A [-+]?\d+ \z /xms ) {                                  
      # an integer
+    if    ( ! defined $value ) {                                               
      # an empty list
+        $pmc_type = 'Undef';
+    }
+    elsif ( $value =~ m/ \A [-+]?\d+ \z /xms ) {                               
      # an integer
         $pmc_type = 'Integer';
     }
     elsif ( $value =~ m/ \A [-+]?((\d+\.\d*) | (\.d+)) ([eE][-+]?\d+)? \z/xms 
) {    # a float
@@ -240,17 +243,11 @@
     }
     
     my $return;
-    if ( $pmc_type ) {
-        $return = $self->_save_1( 'P' );
-        $self->_add_inst( '', 'new', [ $return, qq{'$pmc_type'} ] );
-        $self->_add_inst( '', 'set', [ $return, $value ] );
-    }
-    else {
-        $return = $self->_save_1( $reg_type );
-        $self->_add_inst( '', 'set', [ $return, $value ] );
-    }
+    $return = $self->_save_1( 'P' );
+    $self->_add_inst( '', 'new', [ $return, qq{'$pmc_type'} ] );
+    $self->_add_inst( '', 'set', [ $return, $value ] ) if defined $value;
 
-    $self->_add_comment( 'end of _constant' );
+    $self->_add_comment( "returning $return from _constant()" );
 
     return $return;
 }
@@ -281,7 +278,10 @@
 
     if ( exists $node->{value} ) {
         my $value = $node->{value};
-        if ( $value =~ m/ \A [-+]? \d+ \z/xms ) {
+        if    ( ! defined $value ) {
+            $self->_add_inst( '', 'new', [ $return, q{'Undef'} ] );
+        }
+        elsif ( $value =~ m/ \A [-+]? \d+ \z/xms ) {
             $self->_add_inst( '', 'new', [ $return, q{'Integer'} ] );
             $self->_add_inst( '', 'set', [ $return, $value ] );
         }
@@ -885,8 +885,7 @@
 
     $self->_add_comment( 'start of _op_list()' );
 
-    my $ret_reg = $self->_save_1('P');   # need a single register
-    $self->_add_inst( '', new => [ $ret_reg, q{'Undef'} ] );
+    my $return = $self->_constant(undef);
 
     # build up the list in reverse order
     foreach ( reverse _get_args($node) ) {
@@ -896,15 +895,15 @@
         $self->_add_inst( '', 'new', [ $pair,         q{'Array'} ] );
         $self->_add_inst( '', 'set', [ $pair,         2 ] );
         $self->_add_inst( '', 'set', [ $pair . '[0]', $item ] );
-        $self->_add_inst( '', 'set', [ $pair . '[1]', $ret_reg ] );
-        $self->_add_inst( '', 'set', [ $ret_reg,       $pair ] );
+        $self->_add_inst( '', 'set', [ $pair . '[1]', $return ] );
+        $self->_add_inst( '', 'set', [ $return,       $pair ] );
 
         $self->_restore( $item, $pair );
     }
 
-    $self->_add_comment( 'end of _op_list()' );
+    $self->_add_comment( "returning $return from _op_list()" );
 
-    return $ret_reg;
+    return $return;
 }
 
 sub _op_length {
@@ -2283,14 +2282,12 @@
             $self->_restore(@args);
         }
     }
+    elsif (    defined $node->{value}
+            && $node->{value} =~ m/ \A [a-zA-Z] /xms ) {
+        $return = $self->_find_lex( $node->{value} );
+    }
     else {
-        my $value = $node->{value};
-        if ( $value =~ m/ \A [a-zA-Z] /xms ) {
-            $return = $self->_find_lex($value);
-        }
-        else {
-            $return = $self->_constant( $node->{value} );
-        }
+        $return = $self->_constant( $node->{value} );
     }
 
     return $return;

Modified: trunk/languages/scheme/lib/Scheme/Parser.pm
==============================================================================
--- trunk/languages/scheme/lib/Scheme/Parser.pm (original)
+++ trunk/languages/scheme/lib/Scheme/Parser.pm Sun Nov  4 03:42:56 2007
@@ -19,16 +19,21 @@
     die "EOF reached" if $count > $#$tokens;
 
     if ( $tokens->[$count] eq '(' ) {
-        my $tree = { children => []
-                   };
         $count++;                                   # consume the '('
+        my @children;
         while ( $tokens->[$count] ne ')' ) {
             ( $count, my $expr ) = _build_tree( $tokens, $count );
-            push @{ $tree->{children} }, $expr;
+            push @children, $expr;
         }
         $count++;                                   # consume the ')'
 
-        return ( $count, $tree );
+        if ( ! @children ) {
+            # special case: empty list
+            return ( $count, { value => undef } );
+        }
+        else {
+            return ( $count, { children => [EMAIL PROTECTED] } );
+        }
     } 
 
     my %function = (

Reply via email to