2015-01-04 8 views
3

c2hschsc2hs을 사용하는 동안 많은 작업을 절약 할 수 있었고 C 공용체의 바인딩을 만들 때 몇 가지 문제가 발생했습니다. 구조는 C하스켈에서 c2hsc와 hsc2hs를 통해 C 공용체 인터페이스하기

typedef struct { 
     int tag; 
     union { 
      char a; 
      double b; 
     } v; 
} sum_t; 

c2hsc 주어진 예


가 나를 위해 다음 코드를 작성하는 다음 v 필드가 비어 생성

#starttype sum_t 
#field tag , CInt 
#field v , 
#stoptype 

. hsc2hs를 통해 툴체인 아래로 더가는 것은 잘못된

data C'sum_t = C'sum_t{ 
    c'sum_t'tag :: CInt, 
    c'sum_t'v :: 
} 

질문은 지금

  1. 수동으로 .hsc 코드를 작성 그래서 바인딩 작업 할 수 올바른 방법은 무엇입니까

    입니다 산출?
  2. c2hsc 할 수있는 방법이 있나요?
+3

'hsc2hs' 코드베이스에서 노동 조합에 대한 언급이 없기 때문에 구현되지 않았다고 생각합니다. 또한 노동 조합은 본질적으로 안전하지 않으므로이를 어떻게 대수 데이터 유형으로 변환할지는 분명하지 않습니다. 그것을 안전하게하려면 판별 자도 필요합니다. 이것은 판사가 아닌 조합입니다. – Rufflewind

+0

최선의 방법은 C에서 직접 생성하고 조작하는 함수를 작성한 다음 하스켈 측에서 사용하는 것입니다. 그러나 나는 FFI에 대해 아무것도 모른다. – dfeuer

답변

0

c2hsc 매크로는 bindings-dsl 매크로를 생성합니다. documentation there을 사용하면 직접 작성하는 방법을 알 수 있습니다. 포인터를 사용하여 노동 조합을 조작하는 방법 ... 같은

#starttype struct sum_t 
#field tag , CInt 
#field v.a , CChar 
#field v.b , CDouble 
#stoptype 

문서 goes on to describe 뭔가를 생각해 보자.