int lval_eq(lval* x, lval* y) { if (x->type != y->type) { return 0; } switch (x->type) { case LVAL_NUM: return (x->num == y->num); case LVAL_ERR: return (strcmp(x->err, y->err) == 0); case LVAL_SYM: return (strcmp(x->sym, y->sym) == 0); case LVAL_STR: return (strcmp(x->str, y->str) == 0); case LVAL_FUN: if (x->builtin || y->builtin) { return x->builtin == y->builtin; } else { return lval_eq(x->formals, y->formals) && lval_eq(x->body, y->body); } case LVAL_QEXPR: case LVAL_SEXPR: if (x->count != y->count) { return 0; } for (int i = 0; i < x->count; i++) { if (!lval_eq(x->cell[i], y->cell[i])) { return 0; } } return 1; break; } return 0; }
lval* builtin_cmp(lenv* e, lval* a, char* op) { LASSERT_NUM(op, a, 2); int r; if (strcmp(op, "==") == 0) { r = lval_eq(a->cell[0], a->cell[1]); } if (strcmp(op, "!=") == 0) { r = !lval_eq(a->cell[0], a->cell[1]); } lval_del(a); return lval_num(r); }
lval* lval_eq(lval* left, lval* right) { if (left->type != right->type) { return lval_bool(0); } switch(left->type) { case LVAL_NUM: case LVAL_BOOL: if (left->num == right->num) { return lval_bool(1); } else { return lval_bool(0); } case LVAL_SYM: if (strcmp(left->sym, right->sym) == 0) { return lval_bool(1); } else { return lval_bool(0); } case LVAL_STR: if (strcmp(left->str, right->str) == 0) { return lval_bool(1); } else { return lval_bool(0); } case LVAL_FUN: if (left->builtin == right->builtin) { return lval_bool(1); } else { if ((lval_eq(left->formals, right->formals)->num == 0) && (lval_eq(left->body, right->body)->num == 0)) return lval_bool(0); } case LVAL_SEXPR: case LVAL_QEXPR: if (left->count != right->count) { return lval_bool(0); } for (int i = 0; i < left->count; i++) { if ((lval_eq(left->cell[i], right->cell[i]))->num == 0) { return lval_bool(0); } } return lval_bool(1); } return lval_bool(0); }
int lval_eq(lval* a, lval* b) { if (a->type != b->type) { return 0; } switch (a->type) { case LVAL_NUM: return a->num == b->num; case LVAL_ERR: return is(a->err, b->err); case LVAL_SYM: return is(a->sym, b->sym); case LVAL_STR: return is(a->str, b->str); case LVAL_FUN: if (a->builtin || b->builtin) { return (a->builtin == b->builtin); } else { return lval_eq(a->formals, b->formals) && lval_eq(a->body, b->body); } case LVAL_SEXPR: case LVAL_QEXPR: if (a->count != b->count) { return 0; } for (int i = 0; i < a->count; i++) { if (!lval_eq(a->cell[i], b->cell[i])) { return 0; } } return 1; } return 0; }
int lval_eq(lval* x, lval* y) { if (x->type != y->type) { return 0; } /* Compare Based upon type */ switch (x->type) { /* Compare Number Value */ case LVAL_NUM: return (x->num == y->num); /* Compare String Values */ case LVAL_ERR: return (strcmp(x->err, y->err) == 0); case LVAL_SYM: return (strcmp(x->sym, y->sym) == 0); case LVAL_STR: return (strcmp(x->str, y->str) == 0); /* If builtin compare, otherwise compare formals and body */ case LVAL_FUN: if (x->builtin || y->builtin) { return x->builtin == y->builtin; } else { return lval_eq(x->formals, y->formals) && lval_eq(x->body, y->body); } /* If list compare every individual element */ case LVAL_QEXPR: case LVAL_SEXPR: if (x->count != y->count) { return 0; } for (int i = 0; i < x->count; i++) { /* If any element not equal then whole list not equal */ if (!lval_eq(x->cell[i], y->cell[i])) { return 0; } } /* Otherwise lists must be equal */ return 1; break; } return 0; }