Lisp Value 函数

我们的 lval 类型已经跃跃欲试了,但我们没有方法能创建新的实例。所以我们定义了两个函数来完成这项任务:

  1. /* Create a new number type lval */
  2. lval lval_num(long x) {
  3. lval v;
  4. v.type = LVAL_NUM;
  5. v.num = x;
  6. return v;
  7. }
  8. /* Create a new error type lval */
  9. lval lval_err(int x) {
  10. lval v;
  11. v.type = LVAL_ERR;
  12. v.err = x;
  13. return v;
  14. }

因为 lval 是一个结构体,所以已经不能简单的使用 printf 函数打印它了。对于不同类型的 lval 我们应该都能正确地打印出来。C 语言为此种需求提供了方便快捷的 switch 语句。它把输入和每种情况(case)相比较,如果值相等,它就会执行其中的代码,直到遇到 break 语句为止。

利用 switch,我们就可以轻松完成需求了:

  1. /* Print an "lval" */
  2. void lval_print(lval v) {
  3. switch (v.type) {
  4. /* In the case the type is a number print it */
  5. /* Then 'break' out of the switch. */
  6. case LVAL_NUM: printf("%li", v.num); break;
  7. /* In the case the type is an error */
  8. case LVAL_ERR:
  9. /* Check what type of error it is and print it */
  10. if (v.err == LERR_DIV_ZERO) {
  11. printf("Error: Division By Zero!");
  12. }
  13. if (v.err == LERR_BAD_OP) {
  14. printf("Error: Invalid Operator!");
  15. }
  16. if (v.err == LERR_BAD_NUM) {
  17. printf("Error: Invalid Number!");
  18. }
  19. break;
  20. }
  21. }
  22. /* Print an "lval" followed by a newline */
  23. void lval_println(lval v) { lval_print(v); putchar('\n'); }