在first step a bootstrapped scheme interpreter内部,我找到了以下typedef,struct,union和enum定义:
typedef enum {FIXNUM} object_type;
typedef struct object {
object_type type;
union {
struct {
long value;
} fixnum;
} data;
} object;
特别是,我不确定我是否理解了union(struct { long value; } fixnum;
)中结构的要点 - 一个只有一个字段的结构,用于保存一个long?很奇怪。
但我不确定我是否理解更重要的一点。我认为枚举定义正在发生的事情是他为词法实体设置了许多可能的类型值,并且object
是一种持有这些的方法,但也许是有更多的人在C练习比我有可以提供更详细的解释。
谢谢!
答案 0 :(得分:3)
你是对的,结构里面的一个结合内部结构在这段代码中是无用的,但是作者正在使用它作为后面代码的垫脚石。由于他知道未来的代码会是什么样子,他可以准备早期代码,以尽可能减少更改。
在本教程的第二部分中,定义扩展为:
typedef enum {BOOLEAN, FIXNUM} object_type;
typedef struct object {
object_type type;
union {
struct {
char value;
} boolean;
struct {
long value;
} fixnum;
} data;
} object;
现在object
可以包含两个不同的值(布尔值或整数),因此联合现在有用。但内部结构仍然是多余的。注意没有任何处理fixnums的代码必须改变。
我怀疑内部结构只是为了并行。在v0.6中,作者添加了pair
类型,它由两个指针的结构组成。
答案 1 :(得分:2)
你是对的。这将是一种可以包含许多不同类型值的单一类型。
这是第一步。第二步是为此添加另一种类型。
为此,您需要向enum
添加类型ID,并将值本身添加到联合中,例如:
typedef enum {FIXNUM,FLOATNUM} object_type;
typedef struct object {
object_type type;
union {
struct { long value; } fixnum;
struct { float value; } floatnum;
} data;
} object;
至于你有单场结构的原因,我猜他们以后会考虑多场结构的可能性:
typedef enum {FIXNUM,FLOATNUM,STRING} object_type;
typedef struct object {
object_type type;
union {
struct { long value; } fixnum;
struct { float value; } floatnum;
struct { size_t len; char *data; } string;
} data;
} object;
这只是我的假设,当你逐步完成迭代为什么他们选择这样做时,它可能会变得清晰。