排序函数

为了简单起见,我们将复用之前的数字数据类型来表示比较结果。 制定一个类似于C语言的规则,假设任何不是0的数字在if语句中总为true,而0则总为false。

因此,我们的排序函数有点像算术函数的简化版本。 排序函数仅仅能够处理数字。此外,我们想要函数只能适用于两个参数的情形。

如果参数符合这些错误情形,则计算上很简单。我们希望根据两个lval输入之间的相等比较返回一个数字为01lval。 使用C的比较运算符可以做到这一点。 与之前的算术函数一样,我们将使用单个函数来完成所有比较。

首先我们检查错误情形,然后我们比较参数中的数字获得结果。 最后,我们将结果作为数字返回。

  1. lval* builtin_gt(lenv* e, lval* a) {
  2. return builtin_ord(e, a, ">");
  3. }
  1. lval* builtin_lt(lenv* e, lval* a) {
  2. return builtin_ord(e, a, "<");
  3. }
  1. lval* builtin_ge(lenv* e, lval* a) {
  2. return builtin_ord(e, a, ">=");
  3. }
  1. lval* builtin_le(lenv* e, lval* a) {
  2. return builtin_ord(e, a, "<=");
  3. }
  1. lval* builtin_ord(lenv* e, lval* a, char* op) {
  2. LASSERT_NUM(op, a, 2);
  3. LASSERT_TYPE(op, a, 0, LVAL_NUM);
  4. LASSERT_TYPE(op, a, 1, LVAL_NUM);
  5. int r;
  6. if (strcmp(op, ">") == 0) {
  7. r = (a->cell[0]->num > a->cell[1]->num);
  8. }
  9. if (strcmp(op, "<") == 0) {
  10. r = (a->cell[0]->num < a->cell[1]->num);
  11. }
  12. if (strcmp(op, ">=") == 0) {
  13. r = (a->cell[0]->num >= a->cell[1]->num);
  14. }
  15. if (strcmp(op, "<=") == 0) {
  16. r = (a->cell[0]->num <= a->cell[1]->num);
  17. }
  18. lval_del(a);
  19. return lval_num(r);
  20. }