e referenciara por vezes o post anterior. A versao do interpretador coberta pelo texto e a 1.8.O basico da Ruby APIRuby e uma linguagem dinamica, assim como Python, e nao precisa de especificacoes de tipo. Sendo assim, existe um tipo generico quando trabalha-se com a a API: VALUE. Diferentemente da Python/C API nao e usado um ponteiros pro tipo generico, e simplesmente VALUE.Na API nao ha uma exclusividade de convencao de nomes - nem tudo inicia-se com rb_. Ha macros definidas como RSTRING, StringValue e chamadas como rb_define_module. Mas pode-se identificar que todas as chamadas a funcoes da API comecam com rb_ ou ruby_.Quando a intencao e embarcar o interpretador temos que inicia-lo e finaliza-lo. Podemos fazer isso atraves das funcoes ruby_init e ruby_finalize, que iniciam e finalizam o interpretador ruby, respectivamente.A Ruby API pode ser acessada atraves do cabecalho ruby.h, que varia a localizacao em diferentes sistemas e eu conheco apenas uma maneira longa de achar o diretorio, que e atraves do modulo rbconfig, que o mkmf usa pra achar os arquivos. O comando poderia ser feito em uma chamada longa ao interpretador diretamente na linha de comando como segue:hugo@hugo-laptop:~$ ruby -r rbconfig \> -e "puts Config::MAKEFILE_CONFIG['topdir']"/usr/lib/ruby/1.8/i486-linuxhugo@hugo-laptop:~$Isso significa que na minha maquina o arquivo ruby.h esta na pasta /usr/lib/ruby/1.8/i486-linux.Incluir o cabecalho ruby.h cabecalho implica em incluir diversos outros, como <stdio.h>, <stdlib.h>, <string.h>, <limits.h> (se disponiveis).DICA: Inclua sempre o cabecalho ruby.h antes de qualquer cabecalho, pois o Ruby define algumas pre-processor definitions nos cabecalhos padroes (pelo menos no GNU/Linux!).Exemplo #1 - embarcando o interpretador: usando o metodo upcaseO exemplo tem a finalidade de transformar uma string minuscula em uma maiuscula, usando o interpretador Ruby pra isso. Em Ruby o metodo upcase esta definido na classe String. Faremos entao uma conversao do tipo C pra uma string em Ruby e chamaremos em seguida o metodo upcase:#include "ruby.h"int main() { VALUE string_convertida, resultado; ID upcase_id; char *string_minuscula = "hugo"; ruby_init(); upcase_id = rb_intern("upcase"); string_convertida = rb_str_new2(string_minuscula); resultado = rb_funcall(string_convertida, upcase_id, 0); printf("antes: %s, depois: %s\n", string_minuscula, \ StringValuePtr(resultado)); ruby_finalize(); return 0;}O primeiro passo foi incluir o cabecalho ruby.h pra ter acesso a API. Depois foram definidas duas variaveis do tipo VALUE, onde string_convertida guardara a string convertida de C pra Ruby e resultado guardara o retorno do metodo upcase.A variavel upcase_id merece uma atencao especial. Na Ruby API pra passar nomes, em muitos dos casos, nao pode ser atraves de uma string, mas atraves de um ID. Nesse caso, essa variavel guardara o ID do nome upcase.A variavel string_minuscula guarda o valor "hugo", em minusculo, pra ser convertido pra maiusculo.A chamada a funcao ruby_init e pra iniciar o interpretador Ruby pra termos acesso as facilidades do mesmo. A chamada a rb_intern retorna o ID do nome "upcase" caso exista, caso contrario ele criara na tabela de simbolos o id referente ao nome - por isso tem que ser chamado apos a inicializacao do interpretador.A funcao rb_str_new2 cria uma string em ruby, passando como argumento o valor em C.rb_funcall chama uma funcao em um determinado objeto. O primeiro parametro e o objeto em que reside