Ejemplo n.º 1
0
Obj applyPrimitive(Obj func, Obj arglist) {
			if (INFO) printf("%s\n", "applying PRIMITIVE...");
	List* list = GETLIST(arglist);

	primType type = func.val.prim.type;

	if (type == INTPRIM) {
		int arg1 = list->car.val.num;
		int arg2 = list->cdr->car.val.num;
				if (INFO) printf("arg1: %d\narg2: %d\n\n", arg1, arg2);
		intFunc prim = func.val.prim.func.intfunc;
		int result = (*prim)(arg1, arg2);
		return NUMOBJ(result);
	}
	
	else if (type == OBJPRIM) {
		Obj arg = list->car;
				if (INFO) ;
		objFunc prim = func.val.prim.func.objfunc;
		int result = (*prim)(arg);
		return NUMOBJ(result);
	}

	else {
		printf("apply_primitive: unknown primitive function type!\n");
		return DUMMYOBJ;
	}
}
Ejemplo n.º 2
0
bool noCompoundArgs(Obj expr) {
    if (noArgs(expr))
        return true;
    else {
        List* list = GETLIST(expr);
        return isSimple(list->car) && noCompoundArgs(LISTOBJ(list->cdr));
    }
}
Ejemplo n.º 3
0
/*
 * 判断传入参数是否为素数
 * 0 表示不是素数
 * 1 表示是素数
 */
int isPrime(long num) {
  if (num < 0) {
    return 0;
  }
  else {
    return GETLIST(num);
  }
}
Ejemplo n.º 4
0
Obj adjoinArg(Obj val, Obj arglist) {
	List* args = GETLIST(arglist);
	List* head = malloc(sizeof(List));
	head->car = val;
	head->cdr = args;
	head = reverse(head);
	return LISTOBJ(head);
}
Ejemplo n.º 5
0
Obj adjoinArg(Obj val, Obj arglist) {
    List* args = GETLIST(arglist);

    if (!args) return LISTOBJ(makeList(val, args));

    List* pnr = args;
    while (pnr->cdr) pnr = pnr->cdr;

    pnr->cdr = malloc(sizeof(List));
    pnr = pnr->cdr;
    pnr->car = val;
    pnr->cdr = NULL;

    return LISTOBJ(args);
}
Ejemplo n.º 6
0
Obj transformOr(Obj expr) {
    Obj seq = boolExps(expr);

    if (noExps(seq)) return FALSEOBJ;

    Obj first = firstExp(seq);

    List* cdr = GETLIST(seq)->cdr;
    Obj rest = LISTOBJ(makeList(OROBJ, cdr));

    List* ifTrans = makeList(
        IFOBJ, makeList(first, makeList(TRUEOBJ, makeList(rest, NULL))));

    return LISTOBJ(ifTrans);
}
Ejemplo n.º 7
0
/*
 * checkPrime用于判断单个数num是否是素数
 * 这个函数一般在num超过已有list所存储上限的时候调用
 * 判断方式根据素数定义, 判断除了1和其自身外, 是否有其他小于它的数能整除它
 */
int checkPrime(long num) {
  long i;
  
  /* 这里只需要判断sqrt(num)以内的数即可 */
  for (i = 2; i * i< num; i++) {
    if (i < list_len * bits){

      /*
       * 若除数的范围仍然在list给定的范围之内, 可以先判断这个数是否为素数
       * 若是素数, 再判断是否可以整除; 非素数的情况不用考虑
       */

      if (GETLIST(i) && num % i == 0) break;
    }
    else
      /* 当除数大于list给定范围时, 只能一个个考虑了 */
      if (num % i == 0) break;
  }

  if (num % i == 0)
    return 0;
  else
    return 1;
}
Ejemplo n.º 8
0
// UGLY HACK
bool noExps(Obj seq) {
	List* list = GETLIST(seq);
	return GETLIST(seq) == NULL ||
				list->car.tag == ENV;
}
Ejemplo n.º 9
0
Obj quotedText(Obj expr) {
	return CADR(GETLIST(expr));
}
Ejemplo n.º 10
0
Obj firstArg(Obj expr) {
	return CAR(GETLIST(expr));
}
Ejemplo n.º 11
0
// UGLY HACK
bool isLastExp(Obj seq) {
	List* next = CDR(GETLIST(seq));
	return next == NULL || next->car.tag == ENV;
	//return CDR(GETLIST(seq)) == NULL;
}
Ejemplo n.º 12
0
Obj lambdaParams(Obj expr) {
	return CADR(GETLIST(expr));
}
Ejemplo n.º 13
0
bool noExps(Obj seq) {
    List* list = GETLIST(seq);
    return list == NULL;
}
Ejemplo n.º 14
0
Obj funcParams(Obj obj) {
	return CADR(GETLIST(obj));
}
Ejemplo n.º 15
0
Obj ifThen(Obj expr) {
	return CADDR(GETLIST(expr));
}
Ejemplo n.º 16
0
Obj defVal(Obj expr) {
	return CADDR(GETLIST(expr));
}
Ejemplo n.º 17
0
char* specialForm(Obj expr) {
	// return GETLIST(expr)->car.val.name;
	return GETNAME(CAR(GETLIST(expr)));
}
Ejemplo n.º 18
0
Obj restArgs(Obj expr) {
	return LISTOBJ(CDR(GETLIST(expr)));
}
Ejemplo n.º 19
0
Obj getFunc(Obj expr) {
	return CAR(GETLIST(expr));
}
Ejemplo n.º 20
0
bool isLastArg(Obj expr) {
	return CDR(GETLIST(expr)) == NULL;
}
Ejemplo n.º 21
0
Obj beginActions(Obj expr) {
	return LISTOBJ(CDR(GETLIST(expr)));
}
Ejemplo n.º 22
0
Obj assVal(Obj expr) {
	return CADDR(GETLIST(expr));
}
Ejemplo n.º 23
0
Obj ifTest(Obj expr) {
	return CADR(GETLIST(expr));
}
Ejemplo n.º 24
0
Obj funcEnv(Obj obj) {
	return CADDDR(GETLIST(obj));
}
Ejemplo n.º 25
0
Obj ifElse(Obj expr) {
	return CADDDR(GETLIST(expr));
}
Ejemplo n.º 26
0
Obj firstExp(Obj seq) {
	return CAR(GETLIST(seq));
}
Ejemplo n.º 27
0
Obj lambdaBody(Obj expr) {
	return CADDR(GETLIST(expr));
}
Ejemplo n.º 28
0
Obj restExps(Obj seq) {
	// return MKOBJ(LIST, list, CDR(GETLIST(seq)));
	return LISTOBJ(CDR(GETLIST(seq)));
}
Ejemplo n.º 29
0
Obj funcBody(Obj obj) {
	return LISTOBJ(CDDR(GETLIST(obj)));
}
Ejemplo n.º 30
0
bool noArgs(Obj expr) {
	return GETLIST(expr) == NULL;
}