d用联还是用变量

原文

enum F_Type{
    CONS,
    STRN,
    NMBR,
    EROR,
    BOOL,
    FUNC,
}
struct Atom{
    F_Type  kind;
    Atom*   car;
    Atom*   cdr;
    double  num;
    string  str;
    bool    bul;
    F_Error err = F_Error.NOVALUE;
}

已跟踪数据类型,用.

struct Atom {
    F_Type kind;
    union {
        Atom*   car;
        Atom*   cdr;
        double  num;
        string  str;
        bool    bul;
        F_Error err = F_Error.NOVALUE;
    }
}

一般,我建议std.sumtype.它按包含构/所有要求类型的联两个字段实现.
即,你可能面临重构代码来使用匹配(match)试匹配(tryMatch)函数,因为std.sumtype.SumType不会公开底层种类字段.

有几个字段需要共存.需要{car,cdr}或{num}或{str}或{bul}.

由于这是动态类型化语言,我需要原子既可以互换,又可以同时服务不同目的.

只需要构建嵌套匿名构:

struct Atom {
     F_Type kind;
     union {        
        struct {
            Atom*   car; 
            Atom*   cdr; 
        }
        struct {
            double  num; 
            string  str; 
        }
         bool bul; 
     }
     F_Error err = F_Error.NOVALUE; 
//再添加了构造器.
    this( double n ){ kind = F_Type.NMBR; num = n; } // make number
    this( string s ){ kind = F_Type.STRN; str = s; } // make string
    this( bool   b ){ kind = F_Type.BOOL; bul = b; } // make bool
    this( Atom* a, Atom* d ){ kind = F_Type.CONS; car = a; cdr = d; } // make cons
    this( F_Error e, string m ){ kind = F_Type.EROR; err = e; msg = m; } // make error
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值