Пример #1
0
Scheme_Object *scheme_sfs(Scheme_Object *o, SFS_Info *info, int max_let_depth)
{
  int init, i;

  SFS_LOG(printf("sfs %d\n", SCHEME_TYPE(o)));

  if (!info) {
    info = scheme_new_sfs_info(max_let_depth);
  }

  info->pass = 0;
  info->ip = 1;
  info->abs_ip = 1;
  info->saved = scheme_null;
  info->min_touch = -1;
  info->max_touch = -1;
  info->tail_pos = 1;
  init = info->stackpos;
  o = scheme_sfs_expr(o, info, -1);

  if (info->seqn)
    scheme_signal_error("ended in the middle of an expression?");

# if MAX_SFS_CLEARING
  info->max_nontail = info->ip;
  info->abs_max_nontail = info->abs_ip;
# endif

  for (i = info->depth; i-- > init; ) {
    info->max_calls[i] = info->max_nontail;
  }

  {
    Scheme_Object *v;
    v = scheme_reverse(info->saved);
    info->saved = v;
  }

  info->pass = 1;
  info->seqn = 0;
  info->ip = 1;
  info->abs_ip = 1;
  info->tail_pos = 1;
  info->stackpos = init;
  o = scheme_sfs_expr(o, info, -1);

  return o;
}
Пример #2
0
static Scheme_Object *do_define_syntaxes_clone(Scheme_Object *expr, int jit)
{
  Resolve_Prefix *rp, *orig_rp;
  Scheme_Object *naya, *rhs;
  
  rhs = SCHEME_VEC_ELS(expr)[0];
#ifdef MZ_USE_JIT
  if (jit) {
    if (SAME_TYPE(SCHEME_TYPE(expr), scheme_define_syntaxes_type))
      naya = scheme_jit_expr(rhs);
    else {
      int changed = 0;
      Scheme_Object *a, *l = rhs;
      naya = scheme_null;
      while (!SCHEME_NULLP(l)) {
        a = scheme_jit_expr(SCHEME_CAR(l));
        if (!SAME_OBJ(a, SCHEME_CAR(l)))
          changed = 1;
        naya = scheme_make_pair(a, naya);
        l = SCHEME_CDR(l);
      }
      if (changed)
        naya = scheme_reverse(naya);
      else
        naya = rhs;
    }
  } else
#endif
    naya = rhs;

  orig_rp = (Resolve_Prefix *)SCHEME_VEC_ELS(expr)[1];
  rp = scheme_prefix_eval_clone(orig_rp);
  
  if (SAME_OBJ(naya, rhs)
      && SAME_OBJ(orig_rp, rp))
    return expr;
  else {
    expr = scheme_clone_vector(expr, 0, 1);
    SCHEME_VEC_ELS(expr)[0] = naya;
    SCHEME_VEC_ELS(expr)[1] = (Scheme_Object *)rp;
    return expr;
  }
}
Пример #3
0
/*
 * (getenv <what>) => <string>
 * returns environment value for <what>; if <what> is not given, returns a list of all environment key/value pairs
 */
static pointer s_getenv(scheme* sc, pointer arg) {
	if(arg == sc->NIL) {
		char** env = environ;
		pointer lst = sc->NIL;

		while(*env) {
			lst = cons(sc, mk_string(sc, *env), lst);
			env++;
		}

		return scheme_reverse(sc, lst);
	}
	
	pointer a = sc->vptr->pair_car(arg);
	if(a != sc->NIL && sc->vptr->is_string(a)) {
		const char* val;
		if((val = getenv(sc->vptr->string_value(a))) != NULL)
			return mk_string(sc, val);
	}

	return sc->F;
}
Пример #4
0
/* (exec cmd) => (output list) */
static pointer s_exec(scheme* sc, pointer args) {
	if(args == sc->NIL)
		return sc->F;

	pointer a = sc->vptr->pair_car(args);
	if(a == sc->NIL || !sc->vptr->is_string(a)) {
		/* TODO: this should be an error */
		return sc->F;
	}

	const char *cmd = sc->vptr->string_value(a);
	FILE *fd = popen(cmd, "r");
	if(!fd)
		return sc->F;

	pointer lst = sc->NIL;
	char    buf[256];
	int     len;

	while(fgets(buf, sizeof(buf), fd)) {
		len = strlen(buf);

		/* remove appended newline */
		if(len > 1 && buf[len - 1] == '\n') {
			buf[len - 1] = '\0';
			len--;
		} else {
			/* do not append empty lines or possible newlines */
			continue;
		}

		lst = cons(sc, mk_counted_string(sc, buf, len), lst);
	}

	pclose(fd);
	return scheme_reverse(sc, lst);
}
Пример #5
0
int main(int argc, char **argv) {
	FILE       *fin  = NULL;
	const char *expr = NULL;
	scheme      sc;

	if(argc > 1) { 
		if(argv[1][0] == '-') {
			if((strcmp(argv[1], "--help") == 0) || (strcmp(argv[1], "-h") == 0)) {
				help();
				return 0;
			} else if((strcmp(argv[1], "--expression") == 0) || (strcmp(argv[1], "-e") == 0)) {
				if(!argv[2]) {
					printf("This option requires a parameter\n");
					return 1;
				}
				expr = argv[2];
			} else {
				printf("Unrecognized option. Use 'ede-scriptbus --help' for options\n");
				return 1;
			}
		}

		if(!expr) {
			fin = fopen(argv[1], "r");
			if(!fin) {
				fprintf(stderr, "Unable to load '%s' file!\n", argv[1]);
				return 1;
			}
		}
	}

	if(!scheme_init(&sc)) {
		fprintf(stderr, "Fatal: Unable to initialize interpreter!\n");
		return 1;
	}

	scheme_set_input_port_file(&sc, stdin);
	scheme_set_output_port_file(&sc, stdout);

	/* load basic stuff */
	scheme_load_string(&sc, init_scm_content);

	/* register additional functions */
	register_sys_functions(&sc);
	register_communication_functions(&sc);
	register_string_functions(&sc);
	register_wm_functions(&sc);

	/* construct *args* */
	pointer args = sc.NIL;
	for(int i = 0; i < argc; i++) {
		pointer value = mk_string(&sc, argv[i]);
		args = cons(&sc, value, args);
	}

	args = scheme_reverse(&sc, args);
	scheme_define(&sc, sc.global_env, mk_symbol(&sc, "*args*"), args);

	if(!expr) {
		/* load file or go into console */
		if(!fin) {
			fin = stdin;
			printf("Type '(quit)' or press Ctrl-D to quit");
		}

		scheme_load_file(&sc, fin);
	} else {
		/* or execute expression */
		scheme_load_string(&sc, expr);
		if(sc.retcode != 0)
			printf("Bad expression: '%s'\n", expr);
	}

	scheme_deinit(&sc);
	return 0;
}