排序函数
为了简单起见,我们将复用之前的数字数据类型来表示比较结果。 制定一个类似于C语言的规则,假设任何不是0
的数字在if
语句中总为true,而0
则总为false。
因此,我们的排序函数有点像算术函数的简化版本。 排序函数仅仅能够处理数字。此外,我们想要函数只能适用于两个参数的情形。
如果参数符合这些错误情形,则计算上很简单。我们希望根据两个lval
输入之间的相等比较返回一个数字为0
或1
的lval
。 使用C的比较运算符可以做到这一点。 与之前的算术函数一样,我们将使用单个函数来完成所有比较。
首先我们检查错误情形,然后我们比较参数中的数字获得结果。 最后,我们将结果作为数字返回。
lval* builtin_gt(lenv* e, lval* a) {
return builtin_ord(e, a, ">");
}
lval* builtin_lt(lenv* e, lval* a) {
return builtin_ord(e, a, "<");
}
lval* builtin_ge(lenv* e, lval* a) {
return builtin_ord(e, a, ">=");
}
lval* builtin_le(lenv* e, lval* a) {
return builtin_ord(e, a, "<=");
}
lval* builtin_ord(lenv* e, lval* a, char* op) {
LASSERT_NUM(op, a, 2);
LASSERT_TYPE(op, a, 0, LVAL_NUM);
LASSERT_TYPE(op, a, 1, LVAL_NUM);
int r;
if (strcmp(op, ">") == 0) {
r = (a->cell[0]->num > a->cell[1]->num);
}
if (strcmp(op, "<") == 0) {
r = (a->cell[0]->num < a->cell[1]->num);
}
if (strcmp(op, ">=") == 0) {
r = (a->cell[0]->num >= a->cell[1]->num);
}
if (strcmp(op, "<=") == 0) {
r = (a->cell[0]->num <= a->cell[1]->num);
}
lval_del(a);
return lval_num(r);
}
当前内容版权归 NoahDragon 译 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 NoahDragon 译 .