Need Advice: Union or Variant?

H. S. Teoh hsteoh at qfbox.info
Thu Nov 17 21:05:43 UTC 2022


On Thu, Nov 17, 2022 at 08:54:46PM +0000, jwatson-CO-edu via Digitalmars-d-learn wrote:
[...]
> ```d
> enum F_Type{
>     CONS, // Cons pair
>     STRN, // String/Symbol
>     NMBR, // Number
>     EROR, // Error object
>     BOOL, // Boolean value
>     FUNC, // Function
> }
> 
> struct Atom{
>     F_Type  kind; // ---------------- What kind of atom this is
>     Atom*   car; // ----------------- Left  `Atom` Pointer
>     Atom*   cdr; // ----------------- Right `Atom` Pointer
>     double  num; // ----------------- Number value
>     string  str; // ----------------- String value, D-string underlies
>     bool    bul; // ----------------- Boolean value
>     F_Error err = F_Error.NOVALUE; // Error code
> }
> 
> ```
> Question:
> **Where do I begin my consolidation of space within `Atom`?  Do I use
> unions or variants?**

In this case, since you're already keeping track of what type of data is
being stored in an Atom, use a union:

	struct Atom {
		F_Type kind;
		union {		// anonymous union
			Atom*   car; // ----------------- Left  `Atom` Pointer
			Atom*   cdr; // ----------------- Right `Atom` Pointer
			double  num; // ----------------- Number value
			string  str; // ----------------- String value, D-string underlies
			bool    bul; // ----------------- Boolean value
			F_Error err = F_Error.NOVALUE; // Error code
		}
	}

Use Variant if you don't want to keep track of the type yourself.


T

-- 
An elephant: A mouse built to government specifications. -- Robert Heinlein


More information about the Digitalmars-d-learn mailing list