SciRuby / rubex

rubex - A Ruby-like language for writing Ruby C extensions.
BSD 2-Clause "Simplified" License
451 stars 21 forks source link

Error in C compilation when rubex method is recursive #22

Closed shaunakpp closed 6 years ago

shaunakpp commented 7 years ago

Consider a simple example of printing sum of n Fibonacci numbers.

# fibonacci.rubex
class Fibonacci
  def compute(int n)
    if n == 0 || n == 1
      return n
    end
    return compute(n - 1) + compute(n - 2)
  end
end

running rubex fibonacci.rubex successfully generates the extconf.rb, Makefile and fibonacci.c files. But, on running make, I got the following errors:

compiling fibonacci.c
fibonacci.c:30:9: error: redefinition of '__rubex_rb_f_Fibonacci_compute_actual_args'
  VALUE __rubex_rb_f_Fibonacci_compute_actual_args[1];
        ^
fibonacci.c:29:9: note: previous definition is here
  VALUE __rubex_rb_f_Fibonacci_compute_actual_args[1];
        ^
fibonacci.c:47:101: error: expected ')'
  return ( rb_funcall(__rubex_rb_f_Fibonacci_compute_actual_args[0] = INT2NUM(( __rubex_arg_n - 1 ));
                                                                                                    ^
fibonacci.c:47:22: note: to match this '('
  return ( rb_funcall(__rubex_rb_f_Fibonacci_compute_actual_args[0] = INT2NUM(( __rubex_arg_n - 1 ));
                     ^
fibonacci.c:48:116: warning: expression result unused [-Wunused-value]
  __rubex_rb_f_Fibonacci_compute(1, __rubex_rb_f_Fibonacci_compute_actual_args,__rubex_arg_self), rb_intern("+") , 1, __rubex_rb_f_Fibonacci_compute_actual_args[0] = INT2N...
                                                                                                                   ^
fibonacci.c:49:97: error: expected ';' after expression
  __rubex_rb_f_Fibonacci_compute(1, __rubex_rb_f_Fibonacci_compute_actual_args,__rubex_arg_self)) );
                                                                                                ^
                                                                                                ;
fibonacci.c:49:97: error: expected expression
1 warning and 4 errors generated.
make: *** [fibonacci.o] Error 1

It would be awesome if recursion is supported in rubex, as recursion often helps in writing concise programs.

v0dro commented 6 years ago

Fixed in https://github.com/SciRuby/rubex/commit/6da376e4a22d26079af70c0406680f2f52d3ae83