Lisp Value 函数
我们的 lval
类型已经跃跃欲试了,但我们没有方法能创建新的实例。所以我们定义了两个函数来完成这项任务:
/* Create a new number type lval */
lval lval_num(long x) {
lval v;
v.type = LVAL_NUM;
v.num = x;
return v;
}
/* Create a new error type lval */
lval lval_err(int x) {
lval v;
v.type = LVAL_ERR;
v.err = x;
return v;
}
因为 lval
是一个结构体,所以已经不能简单的使用 printf
函数打印它了。对于不同类型的 lval
我们应该都能正确地打印出来。C 语言为此种需求提供了方便快捷的 switch
语句。它把输入和每种情况(case
)相比较,如果值相等,它就会执行其中的代码,直到遇到 break
语句为止。
利用 switch
,我们就可以轻松完成需求了:
/* Print an "lval" */
void lval_print(lval v) {
switch (v.type) {
/* In the case the type is a number print it */
/* Then 'break' out of the switch. */
case LVAL_NUM: printf("%li", v.num); break;
/* In the case the type is an error */
case LVAL_ERR:
/* Check what type of error it is and print it */
if (v.err == LERR_DIV_ZERO) {
printf("Error: Division By Zero!");
}
if (v.err == LERR_BAD_OP) {
printf("Error: Invalid Operator!");
}
if (v.err == LERR_BAD_NUM) {
printf("Error: Invalid Number!");
}
break;
}
}
/* Print an "lval" followed by a newline */
void lval_println(lval v) { lval_print(v); putchar('\n'); }
当前内容版权归 NoahDragon 译 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 NoahDragon 译 .