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
}
posted @   zjh6  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示