Взаимодействие с языком Си

object f64
    val min "DBL_MIN" : f64
    val max "DBL_MAX" : f64
    val epsilon "DBL_EPSILON" : f64

Внешние константы DBL_MIN, DBL_MAX и DBL_EPSILON представлены полями объекта f64.

Типы

type i32 @c
type CChar "char"

Атрибут @c нужен в случае, если имя типа совпадает с внешним.

type VkInstance = MutPtr
type CString = ptr CChar

Именованный кортеж с единственным элементом в Си коде представлен как тип элемента, поэтому в объявлениях внешних функций VkInstance и CString можно использовать вместо void* и const char*.

typealias DebugUtilsMessengerCallbackExt = fn
    (message_severity : DebugUtilsMessageSeverityFlagsExt)
    * (message_types : DebugUtilsMessageTypeFlagsExt)
    * (callback_data : ptr DebugUtilsMessengerCallbackDataExt)
    * (user_data : MutPtr) -> u32

typealias CharFun = fn GlfwWindow * u32 -> Unit

Псевдонимы для типов указателей на функцию.

type SampleCountFlags = flags
    | 1
    | 2
    | 4
    | 8
    | 16
    | 32
    | 64

Символы флагов могут быть числами или начинаться с цифры.

type InstanceCreateInfo = struct
    type : StructureType
    next : Ptr
    flags : InstanceCreateFlags
    application_info : ptr ApplicationInfo
    enabled_layer_count : u32
    enabled_layer_names : ptr CString
    enabled_extension_count : u32
    enabled_extension_names : ptr CString

type ClearValue = union
    color : ClearColorValue
    depth_stencil : ClearDepthStencilValue    

Структуры и объединения соответствуют одноимённым конструкциям Си.

Функции

module vk

def create_semaphore "vkCreateSemaphore"
    (device : VkDevice)
    (create_info : ptr SemaphoreCreateInfo)
    (allocator : Allocator)
    (semaphore : mut ptr VkSemaphore) : Result

endmodule

Библиотечная функция vkCreateSemaphore доступна под именем vk/create_semaphore.

def create_semaphore (device : VkDevice) =
    let semaphore_create_info = SemaphoreCreateInfo
        type = StructureType/SemaphoreCreateInfo
        next = null
        flags = SemaphoreCreateFlags@zero

    let mut semaphore = null
    vk/create_semaphore device semaphore_create_info@ptr null
                        semaphore@mut_ptr
    |> assert_success

    semaphore

Модификаторы @ptr и @mut_ptr возвращают указатель на значение, @fn — указатель на функцию, @zero — обнулённый блок памяти.

type f32 @c =
    def sin "sinf" : f32
    def cos "cosf" : f32
    
type f64 @c =
    def sin @c : f64
    def cos @c : f64    

Внешняя функция может быть методом.