Взаимодействие с Си и C++

Си

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* и char const*.

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 : f64
    def cos : f64    

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

C++

type TileMode "SkTileMode" =
    | Clamp "kClamp"
    | Repeat "kRepeat"
    | Mirror "kMirror"
    | Decal "kDecal"
    | Last "kLastTileMode" = Decal

TileMode это перечисление.

type List<T> "std::vector" =
    def add "push_back" (x : T)
    let erase (iterator : Iterator) : Iterator
    let begin () : Iterator

    def remove_at (i : i32) =
        erase (begin + i) |> ignore

List распознаётся в качестве C++ типа, так как имя в кавычках содержит двойное двоеточие. В ином случае понадобится атрибут @cpp.

C++ типы имеют такую же семантику перемещения, как и определённые с атрибутом @move, и могут быть ими унаследованы.