-
Notifications
You must be signed in to change notification settings - Fork 0
Intermediate de
English | 中文 | Русский | Español | Português | 繁體中文 | Deutsch
Praktische Anwendung: Streams und Implementierungen, Klassen und Objekte, das
need-Annahmesystem, Arrays, Datei-E/A, Threads und das Erstellen echter Projekte.
Ein Signatur-Stream deklariert, was ein Stream kann; eine Implementierung setzt es um. Aufrufe laufen über die Signatur, Implementierungen werden eingesteckt.
// 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);
}
}
Aufruf:
Greeter::greet("TAK");
// hello, TAK
Ein Aufruf über den Namen des Signatur-Streams fällt auf seinen Implementierungs-Stream zurück.
Stream Counter {
int count;
void bump();
}
Counter C {
void bump() { this::count = count + 1; }
}
this::count bezieht sich auf das eigene Feld des Streams; count wird über
die Scope-Kette aufgelöst. Bloße Aufrufe (bump()) funktionieren innerhalb
des Streams.
Eine Klasse ist ein Stream, der instanziiert werden kann:
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()erzeugt ein Objekt;__init__ist der Konstruktor. -
obj::method(...)ruft Methoden auf,obj.fieldliest Felder. -
Obj::set("name", v)/Obj::get("name")greift dynamisch auf Attribute zu. - Ein weggeschwemmtes Attribut verweigert den Zugriff: „property X was washed away".
need deklariert eine Abhängigkeit; Provider werden automatisch
eingesammelt:
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 bündelt rekursiv jeden Provider, der vom main-Einstiegspunkt
aus erreichbar ist — ein need ohne Provider ist ein Fehler.
BioLang-Arrays wachsen automatisch:
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
Die Klasse Array und die Klasse Vector sind selbst in BioLang
geschrieben; Arrays::count(), Arrays::forget(v) verwalten die lebenden
Instanzen.
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; antwortet mit mehreren Werten auf einmal; sie kommen als
rohes Array an.
FIO ist der Datei-Stream. Öffne eine Datei und lies/schreibe über die
E/A-Kernmethoden:
// 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
Textmethoden: print / println / get / getln. Bytenmethoden:
write / read. Außerdem FIO::writeFile(path, content) und
FIO::readFile(path) für Operationen auf ganzen Dateien.
SIO hält einen String im Speicher, gegen den die E/A-Methoden lesen und
schreiben — praktisch zum Aufbauen von Text:
SIO::println("Hello");
SIO::print("World");
CIO::println(SIO::content()); // Hello\nWorld
CIO::println(SIO::buf()); // whole buffer incl. consumed bytes
SIO::clear();
Werkzeuge: format, length, upper, lower, trim, contains,
substring, replace.
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...)startet eine bloße Methode auf einem neuen Thread. -
Threads::join(t)wartet und holt das Ergebnis. -
Threads::active(),Threads::self(),Threads::yield(). - Threads sind kooperativ — keine Verdrängung; ein Thread muss
yieldaufrufen oder zu Ende laufen, damit andere laufen können.
Round-Robin-Scheduling von Aufgaben:
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));
Ein Projekt = 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 interpretedpackage.toml:
name = "myapp"
version = "0.1.0"
[dependencies]
libfoo = { version = "1.0.0", repo = "https://github.com/user/libfoo" }Abhängigkeitsauflösung: das eigene repo der Abhängigkeit → Datei
BIOLANG_CONFIG → ~/.biolang/config.toml.
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 packageSiehe Packaging für die .img-/.zip-Formate.
- Experte — intelligente Referenzen, Binärbibliotheken, Speicher, plattformübergreifend.
- Einsteiger, falls du die Grundlagen übersprungen hast.
- Home
- Beginner — first steps
- Intermediate — real usage
- Advanced — masterclass
- Build & Run
- Packaging
- Language-Reference
- BR-Model
- BTM-Model