# CGenerator is now a gem

**URL:** <https://www.ruby-forum.com/t/cgenerator-is-now-a-gem/172735>\
**Category:** Ruby\
**Created:** [July 27, 2009, 7:48am UTC](https://www.ruby-forum.com/t/cgenerator-is-now-a-gem/172735 "2009-07-27T07:48:03Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Joel\_VanderWerf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e19b73/32.png) [@Joel\_VanderWerf](https://www.ruby-forum.com/u/Joel_VanderWerf)\
**Post date:** [July 27, 2009, 7:48am UTC](https://www.ruby-forum.com/t/cgenerator-is-now-a-gem/172735/1 "2009-07-27T07:48:03Z")

</div>

CGenerator is a framework for dynamically generating and loading C  
extensions from Ruby programs. Includes CShadow module for defining  
classes in terms of C structs with accessors and inheritance.

It’s been in use for almost 8 years.

Installation:  
gem install cgen  
or download at [http://rubyforge.org/projects/cgen](http://rubyforge.org/projects/cgen)

Example:

require ‘cgen/cshadow’

class Complex \< Numeric  
include CShadow

shadow\_attr\_accessor :re =\> “double re”  
shadow\_attr\_accessor :im =\> “double im”

def initialize re, im  
self.re = re  
self.im = im  
end

define\_c\_method(:abs) {  
include “\<math.h\>”  
returns “rb\_float\_new(sqrt(pow(shadow-\>re, 2) + pow(shadow-\>im,  
2)))”  
}

define\_c\_method(:scale!) {  
c\_array\_args {  
optional :factor  
default :factor =\> “INT2NUM(10)”  
typecheck :factor =\> Numeric  
}  
body %{  
shadow-\>re \*= NUM2DBL(factor);  
shadow-\>im \*= NUM2DBL(factor);  
}  
returns “self”  
}  
end

Complex.commit

z = Complex.new 5, 1.3  
p z # ==\> #\<Complex:0xb7dc0098 re=5.0, im=1.3\>  
puts z.abs # ==\> 5.1662365412358  
z.scale! 3.0 # float  
p [z.re, z.im] # ==\> [15.0, 3.9]  
z.scale! 3 # int  
p [z.re, z.im] # ==\> [45.0, 11.7]  
z.scale! # use default value  
p [z.re, z.im] # ==\> [450.0, 117]
