Syntax-Kurzreferenz

Häufig verwendete Deklarationen, Kontrollfluss, Typen, Zeiger und FFI-Grammatik sind auf einer Seite organisiert.

Wave Foundation

Erklärung

var value: i32 = 1;
var next: i32 = value + 1;
const LIMIT: i32 = 64;
static total: i64 = 0;
type Identifier = u64;

var ist die Region, const/static sind Deklarationen der obersten Ebene. Lokale Variablen deklarieren explizit ihren Typ.

Funktionen

fun max(left: i32, right: i32) -> i32 {
    if (left > right) {
        return left;
    }

    return right;
}

generisch

fun identity<T>(value: T) -> T {
    return value;
}

var value: i32 = identity<i32>(10);

Geben Sie beim Aufruf eines Generic ein Typargument an.

Struktur und enum

struct Pair {
    left: i32;
    right: i32;
}

enum Result -> i32 {
    Ok = 0,
    Error,
}

Bedingungen und Schleifen

if (ready) {
    println("ready");
}

while (count < 10) {
    count += 1;
}

for (var i: i32 = 0; i < 10; i += 1) {
    println("{}", i);
}

match (status) {
    Ready => {
        println("ready");
    }
    0 => {
        println("zero");
    }
    _ => {
        println("other");
    }
}

Die Überschriften von if, while, for und match verwenden Klammern.

Arrays und Zeiger

var values: array<i32, 4> = [1, 2, 3, 4];
var p: ptr<i32> = &values[0];
var first: i32 = deref p;

Konsolen-Ein-/Ausgabe

print("value = ");
println("{}", value);
input("{}", value);

Das erste Argument ist ein String-Literal. Jeder exakte {}-Platzhalter erfordert einen darauf folgenden Ausdruck, und das input-Ziel muss zuweisbar sein.

import und öffentliche Gegenstände

import("std::string::len");
import("./helpers" as helpers);
import("math")::{
    Vector
};

pub fun add(left: i32, right: i32) -> i32 {
    return left + right;
}

pub import("./extra"):: {
    increment
};

Der lokale Pfad beginnt mit ./. Der Alias ​​import gibt den Modulnamen an und der ausgewählte import importiert die erforderlichen öffentlichen Einträge in den Namensraum dieser Datei. pub import exportiert die ausgewählten Elemente erneut.

FFI

extern(c) fun native_call(value: i32) -> i32;

export(c) fun wave_call(value: i32) -> i32 {
    return value + 1;
}

Bedingtes Zielelement

#[target(os="linux", arch="riscv64")]
extern(c) fun platform_call(value: i32) -> i32;

Unterstützungsbedingungsschlüssel sind arch, os, env, abi. Eigenschaften steuern das nächste Element der obersten Ebene.

Inline-Montage

var result: i64 = 0;
asm {
    "mv a0, a1"
    in("a1") 7
    out("a0") result
    clobber("memory")
}

Anweisungstext und Registernamen sind zielabhängig. Deklarieren Sie alle für den Block erforderlichen Eingänge, Ausgänge und versteckten clobber.

Quelleninspektion

wavec build main.wave --emit=check
wavec print supported-targets
wavec print supported-emit-kinds

Lern- und Beispielbereich

Beispiele für lokale Variablen und Anweisungen, die außerhalb der Funktion separat angezeigt werden, sind Codefragmente, die in den Hauptteil der Funktion eingefügt werden. Vollständige Laufbeispiele und Übungen folgen in Wave Lernprozess. Detaillierte Regeln für Speicher und externe Funktionen finden Sie unter Standardbibliothek.