Implementing Value Storage and Error Handling in a C Lisp Interpreter
This article explains how to create a Lispy Value storage system in C, defining numeric and error types, enumerations, constructors, printing functions, and semantic error detection to support a simple Lisp REPL that evaluates Polish notation expressions.
Value Storage in Lispy Interpreter
After implementing a Polish notation parser, we need a value storage called Lispy Values to hold AST values and error states.
Value Types
We define two value types: numeric operands and error messages.
typedef struct {
int type;
long num;
int err;
} lval;Enumeration for value types:
enum { LVAL_NUM, LVAL_ERR };Enumeration for error types:
enum { LERR_DIV_ZERO, LERR_BAD_OP, LERR_BAD_NUM };Constructors
lval lval_num(long x) {
lval v;
v.type = LVAL_NUM;
v.num = x;
return v;
}
lval lval_err(int x) {
lval v;
v.type = LVAL_ERR;
v.err = x;
return v;
}Printing Functions
void lval_print(lval v) {
switch (v.type) {
case LVAL_NUM:
printf("%li", v.num);
break;
case LVAL_ERR:
if (v.err == LERR_DIV_ZERO) printf("Error: Division By Zero!");
else if (v.err == LERR_BAD_OP) printf("Error: Invalid Operator!");
else if (v.err == LERR_BAD_NUM) printf("Error: Invalid Number!");
break;
}
}
void lval_println(lval v) {
lval_print(v);
putchar('
');
}Semantic Error Detection
During evaluation we propagate errors and check for division by zero, unknown operators, and invalid numbers.
lval eval_op(lval x, char *op, lval y) {
if (x.type == LVAL_ERR) return x;
if (y.type == LVAL_ERR) return y;
if (strcmp(op, "+") == 0) return lval_num(x.num + y.num);
if (strcmp(op, "-") == 0) return lval_num(x.num - y.num);
if (strcmp(op, "*") == 0) return lval_num(x.num * y.num);
if (strcmp(op, "/") == 0) {
if (y.num == 0) return lval_err(LERR_DIV_ZERO);
return lval_num(x.num / y.num);
}
return lval_err(LERR_BAD_OP);
}The main evaluation function walks the AST, evaluates sub‑expressions, and combines them using eval_op. The main function sets up the parsers, reads input, parses, evaluates, prints the result, and cleans up.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
