fun

lib 안의 fun 선언은 C 함수로 바인딩됩니다.

lib C
  # C에서는 double cos(double x)
  fun cos(value : Float64) : Float64
end

한 번 바인딩하면, C 타입의 클래스 메서드인 것처럼 이용할 수 있습니다.

C.cos(1.5) #=> 0.0707372

함수에 인자가 없다면 선언할 때와 호출할 때 모두 괄호를 생략할 수 있습니다.

lib C
  fun getch : Int32
end

C.getch

반환형이 void라면 이 또한 생략할 수 있습니다.

lib C
  fun srand(seed : UInt32)
end

C.srand(1_u32)

가변 인자 함수도 바인딩할 수 있습니다.

lib X
  fun variadic(value : Int32, ...) : Int32
end

X.variadic(1, 2, 3, 4)

C 함수를 호출할 때 (나중에 설명할 to_unsafe를 제외하면) 묵시적 변환은 없다는 사실을 알 수 있습니다. 반드시 예상되는 타입을 넘겨야 하는 것입니다. 정수나 실수형의 경우에는 다양한 to_... 메서드를 사용합니다.

크리스탈의 메서드 이름은 소문자로 시작해야 하므로 fun 이름 또한 소문자로 시작해야 합니다. 대문자로 시작하는 C 함수를 바인딩하려면 크리스탈에서 쓰일 다른 이름을 줄 수 있습니다.

lib LibSDL
  fun init = SDL_Init(flags : UInt32) : Int32
end

이름이 유효한 식별자가 아니거나 타입 이름인 경우 문자열을 이름으로 쓸 수 있습니다.

lib LLVMIntrinsics
  fun ceil_f32 = "llvm.ceil.f32"(value : Float32) : Float32
end

C 함수는 대개 길고 라이브러리 이름이 접두사로 붙어 있기 때문에 이런 방법을 통해 더 짧고 더 나은 이름을 달아줄 수 있습니다.

C 바인딩에 쓸 수 있는 유효한 타입은

  • 원시 타입 (Int8, ..., Int64, UInt8, ..., UInt64, Float32, Float64)
  • 포인터 타입 (Pointer(Int32), Int32*로도 쓸 수 있음)
  • 정적 배열 (StaticArray(Int32, 8), Int32[8]로도 쓸 수 있음)
  • 함수 타입 (Function(Int32, Int32), Int32 -> Int32로도 쓸 수 있음)
  • 이전에 선언된 struct, union, enum, type, alias
  • 반환형이 없음을 나타내는 Void
  • Void와 비슷하지만 코드가 더 이상 진행되지 않음을 나타내는 NoReturn
  • @ [Extern] 속성이 표시된 크리스탈 구조체

타입 문법에서 fun 선언에 쓰인 표기에 대해 알아볼 수 있습니다.

표준 라이브러리에 정의된 LibC lib은 int, short, size_t 등 흔하게 사용되는 C 타입의 별칭을 선언합니다. 이를 바인딩에서 다음과 같이 사용할 수 있습니다.

lib MyLib
  fun my_fun(some_size : LibC::SizeT)
end

주의: C의 char 타입은 크리스탈의 UInt8이므로, char*const char*UInt8*입니다. 크리스탈의 Char 타입은 유니코드의 코드 포인트이므로 4바이트로 나타냅니다. 이는 UInt8이 아니라 Int32와 더 유사합니다. 확실하지 않다면 LibC::Char 별칭을 쓸 수 있습니다.

results matching ""

    No results matching ""