Example #1
0
File: mlis.c Project: kzfm1024/misc
//--------eval---------------        
int eval(int addr){
    int res;
    
    if(atomp(addr)){
        if(numberp(addr))
            return(addr);
        if(symbolp(addr)){
            res = findsym(addr);
            if(res == -1)
                error(CANT_FIND_ERR, "eval", addr);
            else
                return(res);
        }
    }
    else 
    if(listp(addr)){
        if((symbolp(car(addr))) &&(HAS_NAME(car(addr),"quote")))
            return(cadr(addr));
        if(numberp(car(addr)))
            error(ARG_SYM_ERR, "eval", addr);
        if(subrp(car(addr)))
            return(apply(car(addr),evlis(cdr(addr))));
        if(fsubrp(car(addr)))
            return(apply(car(addr),cdr(addr)));
        if(functionp(car(addr)))
            return(apply(car(addr),evlis(cdr(addr))));    
    }
    error(CANT_FIND_ERR, "eval", addr);
    return(0);
}
Example #2
0
int equalp(int x1, int x2){
	int start1,start2,len1,len2,elt;
    
	if(nullp(x1) && nullp(x2))
    	return(1);
    if((nullp(x1) && !nullp(x2)) || (!nullp(x1) && nullp(x2)))
    	return(0);
	if(numberp(x1) && numberp(x2) && numeqp(x1,x2))
    	return(1);
    if(vectorp(x1) && vectorp(x2)){
    	start1 = car(x1); start2 = car(x2);
        len1 = cdr(x1); len2 = cdr(x2);
        if(len1 == len2){
        	if(len1 == 0)
            	return(1);
            else{
        		elt = 0;
        		while(elt < len1){
            		if(!equalp(car(start1+elt),car(start2+elt)))
                		return(0);
                	elt++;
                }
            }
            return(1);
        }
        else
        	return(0);	
    }
	if(atomp(x1) && atomp(x2))
    	return(eqvp(x1,x2));
    if(equalp(car(x1),car(x2)))
    		return(equalp(cdr(x1),cdr(x2)));
    else
    	return(0);
}
Example #3
0
File: mlis.c Project: kzfm1024/misc
int eqp(int addr1, int addr2){
    if((numberp(addr1)) && (numberp(addr2))
        && ((GET_NUMBER(addr1)) == (GET_NUMBER(addr2))))
        return(1);
    else if ((symbolp(addr1)) && (symbolp(addr2))
        && (SAME_NAME(addr1,addr2)))
        return(1);
    else
        return(0);
}
Example #4
0
LISPTR lisp_print(LISPTR x, FILE* out)
{
	if (consp(x)) {
		fputwc('(', out);
		while (true) {
			lisp_print(car(x), out);
			x = cdr(x);
			if (!consp(x)) {
				if (x != NIL) {
					fputws(L" . ", out);
					lisp_print(x, out);
				}
				break;
			}
			fputwc(' ', out);
		}
		fputwc(')', out);
	} else if (symbolp(x)) {
		fputws(string_text(symbol_name(x)), out);
	} else if (numberp(x)) {
		fwprintf(out, L"%g", number_value(x));
	} else if (stringp(x)) {
		fputwc('"', out);
		fputws(string_text(x), out);
		fputwc('"', out);
	} else {
		fputws(L"*UNKOBJ*", out);
	}
	return x;
}
Example #5
0
int atomp(int x){
    if(numberp(x) || symbolp(x) || charp(x) || stringp(x) || booleanp(x) || identifierp(x)
                  || IS_SYNCLO(x))
    	return(1);
    else
    	return(0);
}
Example #6
0
void read_cmnd_line(int argc, char *argv[], double pb[]) {
  int i, j;
  double x;
  int valid;

  for (i = 1; i < argc; i++) {
    for (j = 0; j < NParams; j++)
      if (strcmp(argv[i],ParamTable[j].cmnd) == 0) {
	i = i+1;
	valid = 1;
	if (!numberp(argv[i]))
	  valid = 0;
	else {
	  x = atof(argv[i]);
	  if ((x < ParamTable[j].min) || (x > ParamTable[j].max))
	    valid = 0;
	}
	break;
      }
    if (j < NParams)
      if (valid)
	pb[ParamTable[j].key] = x;
      else
	cerr << "Bad parameter value: " << argv[i-1] << ", " << argv[i] << endl;
    else
      cerr << "Unknown command: " << argv[i] << "; ignored" << endl;
  }
}
Example #7
0
File: mlis.c Project: kzfm1024/misc
int isnumlis(int arg){
    while(!(IS_NIL(arg)))
        if(numberp(car(arg)))
            arg = cdr(arg);
        else
            return(0);
    return(1);
}
Example #8
0
//--------eval---------------        
int eval(int addr){
	int res;
    
    //ctrl+cによる割り込みがあった場合
    if(exit_flag == 1){
    	exit_flag = 0;
        P = addr; //後で調べられるように退避
        printf("exit eval by CTRL_C_EVENT\n"); fflush(stdout);
        longjmp(buf,1);
    }
    
    if(atomp(addr)){
		if(numberp(addr))
    		return(addr);
    	if(symbolp(addr)){
    		res = findsym(addr);
            if(res == 0)
            	error(CANT_FIND_ERR, "eval", addr);
            else
            	switch(GET_TAG(res)){
                	case NUM:	return(res);
                	case SYM:	return(res);
                    case LIS:	return(res);
                	case SUBR:	return(res);
                    case FSUBR:	return(res);
                    case LAMBDA:return(GET_BIND(res));
                }	
        }
    }
    else 
    if(listp(addr)){
    	if((symbolp(car(addr))) &&(HAS_NAME(car(addr),"quote")))
    		return(cadr(addr));
        if(numberp(car(addr)))
        	error(ARG_SYM_ERR, "eval", addr);
    	if(subrp(car(addr)))
    		return(apply(car(addr),evlis(cdr(addr))));
    	if(fsubrp(car(addr)))
            return(apply(car(addr),cdr(addr)));
    	if(lambdap(car(addr)))
    		return(apply(car(addr),evlis(cdr(addr))));	  
    }
    error(CANT_FIND_ERR, "eval", addr);
}
Example #9
0
File: mlis.c Project: kzfm1024/misc
void checkarg(int test, char *fun, int arg){
    switch(test){
        case NUMLIST_TEST:  if(isnumlis(arg)) return; else error(ARG_NUM_ERR, fun, arg);
        case SYMBOL_TEST:   if(symbolp(arg)) return; else error(ARG_SYM_ERR, fun, arg);
        case NUMBER_TEST:   if(numberp(arg)) return; else error(ARG_NUM_ERR, fun, arg);
        case LIST_TEST:     if(listp(arg)) return; else  error(ARG_LIS_ERR, fun, arg);
        case LEN0_TEST:     if(length(arg) == 0) return; else error(ARG_LEN0_ERR, fun, arg);
        case LEN1_TEST:     if(length(arg) == 1) return; else error(ARG_LEN1_ERR, fun, arg);
        case LEN2_TEST:     if(length(arg) == 2) return; else error(ARG_LEN2_ERR, fun, arg);
        case LEN3_TEST:     if(length(arg) == 3) return; else error(ARG_LEN3_ERR, fun, arg);
    }
}
Example #10
0
void read_rcfile(double pb[]) {
  char line[100];
  ifstream rcfile(".cmasrc");
  double x;
  char *pn, *val;
  int i, valid;
  static char whitespace[] = " \t\n";
  static const char tagline[] = "# cmas 2.0";

  if (rcfile.bad())
    return;			// file doesn't exist? just use defaults

  rcfile.getline(line,sizeof(line));
  if (strcmp(line,tagline)) {
    cerr << "Corrupt .cmasrc file?  First line must be '" << tagline << "'" << endl;
    return;
  }

  while (rcfile.getline(line,sizeof(line))) {
    if (line[0] == 0)
      continue;
    if (line[0] == '#')
      continue;

    pn = strtok(line,whitespace);
    if (pn)
      val = strtok(NULL,whitespace);

    for (i = 0; i < NParams; i++)
      if (strcmp(ParamTable[i].name,pn) == 0) {
	valid = 1;
	if (!numberp(val))
	  valid = 0;
	else {
	  x = atof(val);
	  if ((x < ParamTable[i].min) || (x > ParamTable[i].max))
	    valid = 0;
	}
	break;
      }
    if (i < NParams)
      if (valid)
	pb[ParamTable[i].key] = x;
      else
	cerr << "Bad parameter value: " << pn << ", " << val << endl;
    else
      cerr << "Unknown parameter file entry: " << pn << "; ignored" << endl;
  }
}
Example #11
0
/* Check the stack for a compound data argument and return it or NIL     */
LOCAL LVAL findcompound P1C(int, skip_one)
{
  LVAL *next;
  int n;
  
  n = xlargc;
  next = xlargv;
  
  if (skip_one) {
    n--;
    next++;
  }

  for (; n > 0; n--, next++) 
    /* pretesting to speed up non-compound case a bit */
    if (! numberp(*next) && ! stringp(*next) && compoundp(*next))
      return(*next);
  return(NIL);
}
Example #12
0
// evaluate form x with lexical bindings a
LISPTR eval(LISPTR x)
{
    if (consp(x)) {
        // evaluate a form
        LISPTR f = car(x);
        LISPTR args = cdr(x);
        x = apply(f, args);
    } else if (stringp(x) || numberp(x)) {
        return x;
    } else if (symbolp(x)) {
        LISPTR binding = assoc(x, lexvars);
        if (binding != NIL) {
            x = cdr(binding);
        } else {
            x = symbol_value(x);
        }
    }
    return x;
}
Example #13
0
print (expr x)
{
/* inutile car pas de cons donc pas de gc */
/*	begin_decl ();
	decl_expr (&x);
*/
	if (numberp(x))
		printf ("%d", x);
	else if (symbolp(x))
		printf ("%s", name_symbol(x));
	else
	{
		printf ("*");
		print (car(x));
		printf (" ");
		print (cdr(x));
	}

/*	free_expr (); */
}
Example #14
0
NODE *runparse(NODE *ndlist) {
    NODE *curnd = NIL, *outline = NIL, *tnode = NIL, *lastnode = NIL;
    char *str;

    if (nodetype(ndlist) == RUN_PARSE)
		return parsed__runparse(ndlist);
    if (!is_list(ndlist)) {
	    err_logo(BAD_DATA_UNREC, ndlist);
	    return(NIL);
    }
    if (ndlist != NIL && is_word(curnd=car(ndlist)) && getstrlen(curnd) >= 2 &&
	(str=getstrptr(curnd)) && *str++ == '#' && *str == '!')
	    return NIL;	    /* shell-script #! treated as comment line */
    while (ndlist != NIL) {
	curnd = car(ndlist);
	ndlist = cdr(ndlist);
	if (!is_word(curnd))
	    tnode = cons(curnd, NIL);
	else {
	    if (!numberp(curnd))
		tnode = runparse_node(curnd, &ndlist);
	    else
		tnode = cons(cnv_node_to_numnode(curnd), NIL);
	}
	if (tnode != NIL) {
	    if (outline == NIL) outline = tnode;
	    else setcdr(lastnode, tnode);
	    lastnode = tnode;
	    while (cdr(lastnode) != NIL) {
		lastnode = cdr(lastnode);
		if (check_throwing) break;
	    }
	}
	if (check_throwing) break;
    }
    return(outline);
}
Example #15
0
NODE *cnv_node_to_numnode(NODE *ndi)
   {
   NODE *val;
   int dr;
   char s2[MAX_NUMBER], *s = s2;

   if (is_number(ndi))
      return (ndi);
   ndi = cnv_node_to_strnode(ndi);
   if (ndi == UNBOUND) return (UNBOUND);
   if (((getstrlen(ndi)) < MAX_NUMBER) && (dr = numberp(ndi)))
      {
      if (backslashed(ndi))
         noparity_strnzcpy(s, getstrptr(ndi), getstrlen(ndi));
      else
         strnzcpy(s, getstrptr(ndi), getstrlen(ndi));
      if (*s == '+') ++s;
      if (s2[getstrlen(ndi) - 1] == '.') s2[getstrlen(ndi) - 1] = 0;
      if (/*TRUE || */ dr - 1 || getstrlen(ndi) > 9)
         {
         val = newnode(FLOAT);
         setfloat(val, atof(s));
         }
      else
         {
         val = newnode(INT);
         setint(val, atol(s));
         }
      gcref(ndi);
      return (val);
      }
   else
      {
      gcref(ndi);
      return (UNBOUND);
      }
   }
Example #16
0
NODE *maybe_quote(NODE *nd)
   {
   if (nd == UNBOUND || aggregate(nd) || numberp(nd)) return (nd);
   return (make_quote(nd));
   }
Example #17
0
static void
game_usage_info(void)
{
    int i, wid, hgt, circumf, lat, lon, pergame, perside, perturn;
    const char *varid;
    char buf[BUFSIZE];
    Variant *var;
    Obj *vardflt;

    printf("\nGame variant options");
    if (mainmodule == NULL) {
	printf(":\n\n    No game loaded, no information available.\n\n");
	return;
    }
    printf(" for \"%s\":\n\n", mainmodule->name);
    if (mainmodule->variants == NULL) {
	printf("    No variants available.\n\n");
	return;
    }
    for (i = 0; mainmodule->variants[i].id != lispnil; ++i) {
	var = &(mainmodule->variants[i]);
	varid = c_string(var->id);
	vardflt = var->dflt;
	switch (keyword_code(varid)) {
	  case K_SEE_ALL:
	    printf("    -V\t\t\t%s (default %s)\n",
		   var->help,
		   (vardflt == lispnil ? "true" :
		    (c_number(eval(vardflt)) ? "true" : "false")));
	    break;
	  case K_SEQUENTIAL:
	    printf("    -seq\t\t%s (default %s)\n",
		   var->help,
		   (vardflt == lispnil ? "false" :
		    (c_number(eval(vardflt)) ? "false" : "true")));
	    printf("    -sim\t\tSides move simultaneously (opposite of -seq)\n");
	    break;
	  case K_WORLD_SEEN:
	    printf("    -v\t\t\t%s (default %s)\n",
		   var->help,
		   (vardflt == lispnil ? "true" :
		    (c_number(eval(vardflt)) ? "true" : "false")));
	    break;
	  case K_WORLD_SIZE:
	    printf("    -M wid[xhgt][Wcircumf][+lat][+long]\tset world size (default ");
	    /* Note that if the game definition sets these values
	       directly using world or area forms, this is misleading;
	       but that's the fault of the game designer for including
	       both preset values and a variant whose defaults don't
	       match those presets. */
	    circumf = DEFAULTCIRCUMFERENCE;
	    wid = DEFAULTWIDTH;  hgt = DEFAULTHEIGHT;
	    lat = lon = 0;
	    /* Pick the width and height out of the list. */
	    if (vardflt != lispnil) {
		wid = c_number(eval(car(vardflt)));
		vardflt = cdr(vardflt);
	    }
	    if (vardflt != lispnil) {
		hgt = c_number(eval(car(vardflt)));
		vardflt = cdr(vardflt);
	    } else {
		hgt = wid;
	    }
	    /* Pick up a circumference etc if given. */
	    if (vardflt != lispnil) {
		circumf = c_number(eval(car(vardflt)));
		vardflt = cdr(vardflt);
	    }
	    if (vardflt != lispnil) {
		lat = c_number(eval(car(vardflt)));
		vardflt = cdr(vardflt);
	    }
	    if (vardflt != lispnil) {
		lon = c_number(eval(car(vardflt)));
	    }
	    printf("%dx%dW%d", wid, hgt, circumf);
	    if (lat != 0 || lon != 0)
	      printf("+%d+%d", lat, lon);
	    printf(")\n");
	    break;
	  case K_REAL_TIME:
	    pergame = perside = perturn = 0;
	    if (vardflt != lispnil) {
		pergame = c_number(eval(car(vardflt)));
		vardflt = cdr(vardflt);
	    }
	    if (vardflt != lispnil) {
		perside = c_number(eval(car(vardflt)));
		vardflt = cdr(vardflt);
	    }
	    if (vardflt != lispnil) {
		perturn = c_number(eval(car(vardflt)));
	    }
	    printf("    -tgame mins\t\tlimit game time to <mins> minutes (default %d)\n",
		   pergame);
	    printf("    -tside mins\t\tlimit each player <mins> minutes in all (default %d)\n",
		   perside);
	    printf("    -tturn mins\t\tlimit each turn to <mins> minutes (default %d)\n",
		   perturn);
	    break;
	  default:
	    printf("    -v%s[=value]\t%s (default ", varid, var->help);
	    if (vardflt == lispnil
	        || (numberp(vardflt) && c_number(vardflt) == 0)) {
		printf("false");
	    } else if (numberp(vardflt) && c_number(vardflt) == 1) {
		printf("true");
	    } else {
		sprintlisp(buf, vardflt, BUFSIZE);
		printf("%s", buf);
	    }
	    printf(")\n");
	    break;
	}
    }
}
Example #18
0
int f_numberp(int arglist){
	if(numberp(car(arglist)))
    	return(makeT());
    else
    	return(makeNIL());
}
Example #19
0
/* Parenthesize an expression.  Set expr to the node after the first full
 * expression.
 */ 
NODE *paren_expr(NODE **expr, BOOLEAN inparen) {

    NODE *first = NIL, *tree = NIL, *pproc, *retval;
    NODE **ifnode = (NODE **)NIL;

    if (*expr == NIL) {
	if (inparen) err_logo(PAREN_MISMATCH, NIL);
	return *expr;
    }
    first = car(*expr);
    pop(*expr);
    if (nodetype(first) == CASEOBJ && !numberp(first)) {
	if (first == Left_Paren) {
	    tree = paren_expr(expr, TRUE);
	    tree = paren_infix(tree, expr, -1, TRUE);
	    if (*expr == NIL)
		err_logo(PAREN_MISMATCH, NIL);
	    else if (car(*expr) != Right_Paren) {   /* throw the rest away */
		int parens;

		for (parens = 0; *expr; pop(*expr)) {
		    if (car(*expr) == Left_Paren)
			parens++;
		    else if (car(*expr) == Right_Paren)
			if (parens-- == 0) {
			    pop(*expr);
			    break;
			}
		}
		first = tree /* car(tree) */ ;  /* 6.0 */
		tree = cons(Not_Enough_Node, NIL);  /* tell eval */
		tree_dk_how=UNBOUND;
		if (is_list(first))
		    first = car(first);
		if (nodetype(first) != CASEOBJ ||
		    procnode__caseobj(first) == UNDEFINED)
			err_logo(DK_HOW, first);
		else
		    err_logo(TOO_MUCH, first);
	    }
	    else
		pop(*expr);
	    retval = tree;
	} else if (first == Right_Paren) {
	    err_logo(UNEXPECTED_PAREN, NIL);
	    if (inparen) push(first, *expr);
	    retval = NIL;
	} else if (first == Minus_Sign) {
	    push(Minus_Tight, *expr);
	    retval = paren_infix(make_intnode((FIXNUM) 0), expr, -1, inparen);
	} else {	/* it must be a procedure */
	    check_library(first);
	    pproc = procnode__caseobj(first);
	    if (pproc == UNDEFINED) {
		if (missing_space(first)) {
		    push(missing_numeric, *expr);
		    first = missing_alphabetic;
		    pproc = procnode__caseobj(first);
		    retval = gather_args(first, pproc, expr, inparen, ifnode);
		    if (retval != UNBOUND) {
			retval = cons(first, retval);
		    }
		} else if (is_setter(first)) {
		    retval = gather_some_args(0, 1, expr, inparen, ifnode);
		    if (retval != UNBOUND) {
			retval = cons(first, retval);
		    }
		} else {
		    retval = cons(first, NIL);
		    tree_dk_how = first;
		}
	    } else if (nodetype(pproc) == INFIX && NOT_THROWING) {
		err_logo(NOT_ENOUGH, first);
		retval = cons(first, NIL);
	    } else {
		/* Kludge follows to turn IF to IFELSE sometimes. */
		if (isName(first, Name_if)) {
		    ifnode = &first;
		}
		retval = gather_args(first, pproc, expr, inparen, ifnode);
		if (retval != UNBOUND) {
		    retval = cons(first, retval);
		}
	    }
	}
    } else if (is_list(first)) {   /* quoted list */
	retval = make_quote(first);
    } else {
	return first;
    }
    return retval;
}
Example #20
0
File: mlis.c Project: kzfm1024/misc
int f_numberp(int arglist){
    if(numberp(car(arglist)))
        return(T);
    else
        return(NIL);
}