02 O Libro de Ridgun
Os teus dous mellores amigos: ridgunc e stable (Cero ficheiros YAML, prometido)
Hai linguaxes cuxo compilador é marabilloso, pero cuxo sistema de proxectos parece deseñado polo teu peor inimigo: que se un Makefile de 400 liñas con tabuladores invisibles, que se un pom.xml infinito, que se un webpack.config.js que deixa de funcionar se o miras fixo...
En Ridgun fixémonos unha promesa moi simple desde o primeiro día:
"Só haberá dous executables en todo o ecosistema (
ridguncestable), ambos estarán escritos no propio Ridgun, e o ficheiro de configuración do proxecto (build.rg) será código Ridgun normal e corrente. Nin JSON, nin YAML, nin TOML, nin inventos raros."
Imos ver como se usan.
2.1. ridgunc: O francotirador para ficheiros soltos
Cando tes un único ficheiro .rg entre mans e queres probar unha idea rápida, analizar os seus tipos ou compilar un executable, falas directamente con ridgunc.
Só ten 4 comandos que de verdade precisas lembrar:
# 1. "Compila isto ou metín a pata con algún tipo?"
ridgunc check experimento.rg
# 2. "Execútao xa!" (Compila e corre dun tirón)
ridgunc run experimento.rg
# 3. "Faime un binario nativo ELF listo para levar"
ridgunc build experimento.rg -o meu_programa
# 4. "Sácame o artefacto intermedio de bytecode (.rgc)"
ridgunc compile experimento.rg -o experimento.rgc
O superpoder oculto de ridgunc check
Cando lanzas ridgunc check, non só che di "0 erros". Tamén che sopra que estratexia escolleu o analizador estático para cada unha das túas funcións:
InlineSequential: "Esta función é pequeniña e directa; vouna executar en liña sen meter sobrecusto de planificación".LazyStealableTask: "Aquí hai recursión ou un grafo paralelo||; prepároa para que outros núcleos de CPU poidan roubar traballo se fai falta".
O bisturí de ridgunc build (Por que os teus binarios non pesan 20 MB)
Cando executas ridgunc build, o compilador non se limita a cuspir todo o código das bibliotecas que importaras:
- Comeza na túa función
maine percorre o grafo de chamadas para ver que funcións usas de verdade. Se importaches unha biblioteca enorme de 80 funcións pero só chamas a 2, as outras 78 descártanse antes sequera de tocar o ensamblador (Tree-Shaking). - Busca todas as funcións recursivas de cola e convérteas en bucles
loopnativos que consumen 0 bytes de pila. - Pasa a ligazón final con optimización global (fat LTO) e limpa o lixo de depuración DWARF para deixarche un binario compacto e afiado (~350 KB).
2.2. stable: Cando o teu proxecto medra e queres orde
Un ficheiro solto está xenial para un script, pero en canto tes varios módulos, bibliotecas compartidas e probas, precisas un director de orquestra. Ese é stable.
A estrutura de cartafoles dun proxecto Ridgun non ten misterio:
a-mina-super-ferramenta/
├── build.rg # O manifesto do proxecto (é código Ridgun!)
├── src/
│ ├── main/
│ │ └── ridgun/
│ │ ├── lib/ # Os teus módulos reutilizables (`import utilidades`)
│ │ └── app/
│ │ └── main.rg # Punto de entrada (`main => ()`)
│ └── test/
│ └── ridgun/ # As túas baterías de probas (`test *.rg`)
│ └── test todo.rg
└── target/ # Onde aparecen os binarios compilados
2.3. build.rg: Un ficheiro de configuración que nunca che mentirá
Por que nos negamos a usar YAML ou TOML para configurar un proxecto Ridgun?
Porque en YAML trabúcaste en dous espazos de sangrado e non te decatas ata que falla o despregamento. En cambio, como build.rg é un ficheiro Ridgun, ten tipos estáticos, pasa por stable check e alíñase só con stable format:
type ProjectInfo =
name: String
version: String
edition: String
project => ProjectInfo
project = ProjectInfo "a-mina-super-ferramenta" "0.1.0" "2026"
source dir => String
source dir = "src/main/ridgun"
test dir => String
test dir = "src/test/ridgun"
target dir => String
target dir = "target"
-- Opcional: activa o modo estrito de sinaturas e nomes (desactivado por defecto)
strict mode => Bool
strict mode = True
Se te trabucas ao escribir un campo, o propio compilador avísate. Sen sorpresas.
O modo estrito (--strict / strict mode = True)
Por defecto, tanto ridgunc como os novos proxectos creados con stable new ou stable init teñen o modo estrito desactivado para que poidas prototipar con total liberdade. Cando queiras blindar o estilo canónico dun proxecto (como facemos no propio compilador de Ridgun), podes pasar --strict a ridgunc ou engadir strict mode = True ao teu build.rg. O modo estrito esixe dúas regras de elegancia:
- Nomes de
fn ::eop ::con espazos naturais, sen_: as declaracións deben usar espazos (fn :: calcular imposto, nuncafn :: calcular_imposto). - Retornos múltiples separados por espazos tras
=>: cando unha función ou operador devolve varios valores, a súa sinatura de saída escríbese=> Int Intou=> Estado Int(nunca=> (Int, Int)con parénteses nin comas).
2.4. A túa rutina diaria con stable (Os 4 fantásticos)
Cando estás traballando dentro do teu proxecto, o teu día a día redúcese a catro comandos:
1. stable format — A fin das discusións de estilo no equipo
stable format
Que o teu compañeiro pon tres espazos antes do => e ti pos un? Dá igual. Executas stable format e en menos dun segundo deixa todos os ficheiros .rg do repositorio aliñados coma unha táboa suíza.
2. stable check — O radar instantáneo
stable check
Percorre todos os módulos de src/main/ridgun/, verifica tipos, construtores, aridades e dimensións de tensores, e dáche o veredicto módulo por módulo.
3. stable test — Durmir tranquilo polas noites
stable test
Busca todas as suites src/test/ridgun/test *.rg, execútaas e comproba cada assert equals e assert true.
-- Exemplo de src/test/ridgun/test mates.rg
import test
dobro Int => Int
dobro x = x * 2
main => ()
main =
assert equals (dobro 21) 42
assert true ((dobro 5) > 0)
4. stable built (e stable clean) — A produción
stable built
Compila todos os obxectivos nativos en target/. E se algún día queres borrar target/ e comezar limpo: stable clean.
2.5. Como importo un ficheiro desde outro? (import)
Sen rutas relativas infernais tipo ../../../lib/cousas.rg. Se tes un ficheiro src/main/ridgun/lib/cadeas.rg, en calquera outro ficheiro escribes arriba de todo:
import cadeas
E listo: todas as funcións e tipos de cadeas.rg están dispoñibles coma se estivesen no teu propio ficheiro. E que pasa se o módulo A fai import cadeas, o módulo B tamén fai import cadeas, e o teu main.rg importa A e B? Tranquilo: o cargador de Ridgun lembra que ficheiros canónicos leu xa e só o inclúe unha vez.
Agora que tes a caixa de ferramentas controlada, pasemos ao Capítulo 03 para dominar as funcións, os tipos, os bloques e os trucos con cadeas de texto.