Type inference
On control
A missing else branch is not an error. It should be forwarded to the next
continuation. How should that be forwarded? As an atom pointing to NIL? Do all
continuation need to check for NIL then? Or should we simply disallow
if-only control?
Why not use atoms?
We don't use atom_t for performance reason as we don't want to hit the slab
allocator for every new value. That choice deprives us from a type annotation.
Optionals
The default return type is really T | NIL, not simply T. In that case, what
we are really handling are T optional. How do I efficiently implement
optional in C? Should I use another register in the value_t definition to
embed whether the value is present or not? This solution would not optimize
well.
typedef struct _value {
bool present;
union {
int64_t number;
atom_t atom;
atom_t (*callback)(struct _closure * C, struct _value V);
};
}
value_t;
Forbid undefined scenarios
Another solution would be to simply forbid that case since C forbids it. That
allows us keep using simple types.
Decision
We will forbid undefined scenarios.