如何制作C风格的联盟

时间:2017-04-07 15:02:15

标签: racket

我无法找到如何制作C风格的联盟。在documentation中给出的示例中:

(define a-union-type
(_union (_list-struct _int _int)
        (_list-struct _double _double)))
(define a-union-val
    (cast (list 3.14 2.71)
          (_list-struct _double _double)
          a-union-type))

一切正常。但如果转换为_int:

(define a-union-val
    (cast (list 3 2)
          (_list-struct _int _int)
          a-union-type))

我收到以下错误:

cast: representation sizes of from and to types differ
  size of from type: 8
  size of to size: 16

哪种方式有道理,但问题是,如何建立这种联盟?

你能解释一下make-union-type和_union之间的区别吗?因为我从文档中不清楚。

非常感谢。

1 个答案:

答案 0 :(得分:1)

仅在(ctype-sizeof from-type)等于(ctype-sizeof to-type)时才进行投射,因此只允许最大的联合变体。尝试使用手动分配和union-set!代替:

(define a-union-val (ptr-ref (malloc a-union-type) a-union-type))
(union-set! a-union-val 0 (list 3 2))

union-set!的第二个参数是您想要的变体的索引。