static Expr* eqv(Expr* args) { assert(args); if(scm_list_len(args) != 2) return scm_mk_error("eqv? expects 2 args"); Expr* fst = scm_car(args); Expr* snd = scm_cadr(args); if(fst == snd) return TRUE; if(scm_is_pair(fst) || scm_is_pair(snd)) return FALSE; if(scm_is_closure(fst) || scm_is_closure(snd)) return FALSE; if(scm_is_num(fst) && scm_is_num(snd)) return num_eq(args); if(scm_is_string(fst) && scm_is_string(snd) && strcmp(scm_sval(fst), scm_sval(snd)) == 0) return TRUE; return FALSE; }
object_t *eql (object_t * lst) { DOC ("Return t if both arguments are similar."); REQ (lst, 2, c_sym ("eql")); object_t *a = CAR (lst); object_t *b = CAR (CDR (lst)); if (a->type != b->type) return NIL; switch (a->type) { case INT: case FLOAT: return num_eq (lst); break; case SYMBOL: case CONS: if (a == b) return T; break; case STRING: if (OSTRLEN (a) == OSTRLEN (b)) if (memcmp (OSTR (a), OSTR (b), OSTRLEN (a)) == 0) return T; break; case VECTOR: return NIL; break; case DETACH: if (a == b) return T; break; case CFUNC: case SPECIAL: if (FVAL (a) == FVAL (b)) return T; break; } return NIL; }