コード例 #1
0
ファイル: lval.c プロジェクト: pimeys/musti
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;
}
コード例 #2
0
ファイル: builtin.c プロジェクト: burberger/blisp
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);
}
コード例 #3
0
ファイル: lispy.c プロジェクト: Bivek/buildyourownlisp
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);
}
コード例 #4
0
ファイル: val.c プロジェクト: unkiwii/ownlisp
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;
}
コード例 #5
0
ファイル: lval.c プロジェクト: redrifle/get-lispy
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;
}