문법 빠른 참조

자주 쓰는 선언, 제어 흐름, 타입, 포인터와 FFI 문법을 한 페이지에 정리합니다.

Wave Foundation

선언

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

var는 지역, const/static은 최상위 선언입니다. 지역 변수는 타입을 명시적으로 선언합니다.

함수

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

제네릭

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

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

제네릭 호출에는 타입 인자를 명시합니다.

구조체와 enum

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

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

조건과 반복

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"); }
}

if, while, for, match의 헤더는 괄호를 사용합니다.

배열과 포인터

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

콘솔 입출력

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

첫 인자는 문자열 리터럴입니다. 정확한 {} 자리표시자마다 뒤따르는 식이 하나씩 필요하며 input 대상은 대입 가능해야 합니다.

import와 공개 항목

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};

로컬 경로는 ./로 시작합니다. 별칭 import는 모듈 이름을 지정하고, 선택 import는 필요한 공개 항목을 이 파일의 이름 공간으로 가져옵니다. pub import는 선택한 항목을 다시 내보냅니다.

FFI

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

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

대상 조건부 항목

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

지원 조건 키는 arch, os, env, abi입니다. 속성은 바로 다음 최상위 항목을 제어합니다.

인라인 어셈블리

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

명령 텍스트와 레지스터 이름은 대상에 종속됩니다. 블록에 필요한 모든 입력, 출력과 숨은 clobber를 선언하십시오.

소스 검사

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