Skip to content

Intermediate es

Enoch-199811 edited this page Aug 9, 2026 · 1 revision

Intermedio — Flujos, clases, archivos y proyectos

English | 中文 | Русский | Español | Português | 繁體中文 | Deutsch

Uso en el mundo real: flujos y bifurcación, clases y objetos, el sistema de suposiciones need, arrays, E/S de archivos, hilos y compilación de proyectos reales.

Flujos: firma e implementación

Un flujo de firma declara lo que un flujo puede hacer; una implementación lo lleva a cabo. Las llamadas pasan por la firma; las implementaciones se conectan.

// Signature: what the stream offers
Stream Greeter {
    void greet(name string);
}

// Fork: how it works
Greeter FriendlyGreeter {
    void greet(name string) {
        CIO::println("hello,", name);
    }
}

Llamadas:

Greeter::greet("TAK");
// hello, TAK

Una llamada por el nombre del flujo de firma recurre a su flujo de implementación.

Flujos con campos

Stream Counter {
    int count;
    void bump();
}
Counter C {
    void bump() { this::count = count + 1; }
}

this::count se refiere al campo propio del flujo; count se resuelve a través de la cadena de ámbitos. Las llamadas sin calificar (bump()) funcionan dentro del flujo.

Clases y objetos

Una clase es un flujo que se puede instanciar:

Class Hero {
    int hp;
    void __init__() {
        this::hp = 100;
    }
    void takeDamage(d int) {
        this::hp = hp - d;
    }
}

Main {
    void exec() {
        Hero h = new Hero();          // __init__ runs
        h::takeDamage(30);
        CIO::println("hp =", h.hp);   // 70
    }
}
  • new ClassName() crea un objeto; __init__ es el constructor.
  • obj::method(...) llama a métodos; obj.field lee campos.
  • Obj::set("name", v) / Obj::get("name") accede a los atributos dinámicamente.
  • Un atributo eliminado (washed away) rechaza el acceso: "property X was washed away".

El sistema de suposiciones need

need declara una dependencia; los proveedores se recogen automáticamente:

need value GREETING;          // a constant
need function greet;          // a method named greet
need Stream Greeter;          // a stream
need Class Hero;              // a class
// provider file (any included file):
const string GREETING = "Hello from utils/";

bio build agrupa recursivamente todos los proveedores alcanzables desde la entrada mainun need sin proveedor es un error.

Arrays

Los arrays de BioLang crecen automáticamente:

int[] squares = new int[4];
for (int i = 0; i < 4; i = i + 1;) { squares[i] = i * i; }
CIO::println(squares);                    // [ 0 1 4 9 ]

ALL a = new Array(3);
a::set(0, 10);
a::push(40);                              // grows
CIO::println(a::join("-").res);           // join into a string

La clase Array y la clase Vector están escritas en el propio BioLang; Arrays::count(), Arrays::forget(v) gestionan las instancias activas.

Múltiples valores de retorno

void triple(a int) { res a, a * 2, a * 3; }   // respond with several values

ALL t = triple(10);       // t.res is an array [10, 20, 30]
CIO::println(get t);

res a, b, c; responde con varios valores a la vez; llegan como un array en bruto.

E/S de archivos

FIO es el flujo de archivos. Abre un archivo y luego lee/escribe a través de los métodos del núcleo de E/S:

// Writing:
FIO::open("notes.txt", "w");
FIO::println("line one");
FIO::close();

// Reading (text):
FIO::open("notes.txt");
string line = FIO::getln();
CIO::println("read:", line);
FIO::close();

// Reading (bytes):
FIO::open("data.bin");
int byte = FIO::read();           // 0-255, -1 at EOF

Métodos de texto: print / println / get / getln. Métodos de bytes: write / read. También FIO::writeFile(path, content) y FIO::readFile(path) para operaciones con archivos completos.

SIO — buffer de cadenas

SIO mantiene una cadena en memoria sobre la que los métodos de E/S leen/escriben — muy útil para construir texto:

SIO::println("Hello");
SIO::print("World");
CIO::println(SIO::content());     // Hello\nWorld
CIO::println(SIO::buf());         // whole buffer incl. consumed bytes
SIO::clear();

Utilidades: format, length, upper, lower, trim, contains, substring, replace.

Hilos (cooperativos)

Calc Worker {
    void factorial(n int) {
        int r = 1;
        for (int i = 2; i <= n; i = i + 1;) r = r * i;
        res r;
    }
}

Main {
    void exec() {
        ALL t = Threads::spawn("factorial", 10);
        ALL result = Threads::join(t);
        CIO::println("10! =", get result);    // 3628800
    }
}
  • Threads::spawn(name, args...) inicia un método independiente en un hilo nuevo.
  • Threads::join(t) espera y obtiene su resultado.
  • Threads::active(), Threads::self(), Threads::yield().
  • Los hilos son cooperativos — sin expulsión; un hilo debe hacer yield o terminar para que los demás se ejecuten.

Taskm — gestor de tareas

Planificación round-robin de tareas:

Taskm::interval(1);                  // rotate roughly every 1 ms
ALL t1 = Taskm::add("jobA", 5);
Taskm::run();                        // run until all tasks finish
CIO::println(get Threads::join(t1));

Compilar un proyecto

Un proyecto = package.toml + src/ + utils/ + .biolang/deps/:

bio init myapp          # skeleton
# edit src/main.bio, add utils/, declare dependencies
bio build myapp -s      # standalone executable
bio run myapp           # or run interpreted

package.toml:

name = "myapp"
version = "0.1.0"
[dependencies]
libfoo = { version = "1.0.0", repo = "https://github.com/user/libfoo" }

Resolución de dependencias: el repo propio de la dependencia → el archivo BIOLANG_CONFIG~/.biolang/config.toml.

Compilación y empaquetado

bio shell build hello.bio          # → bin/hello (standalone executable)
bio build myapp -s                 # project → standalone
bio build myapp -m                 # project → bin/myapp.img (app + platform CLI + libs)
bio build myapp -m dist.zip        # → .zip package
bio pack hello.img --entry hello bin/hello
bio run hello.img                  # run a package

Consulta Packaging para conocer los formatos .img / .zip.

Qué sigue

  • Avanzado — referencias inteligentes, bibliotecas binarias, memoria, multiplataforma.
  • Principiante si te saltaste los conceptos básicos.

Clone this wiki locally