Not a lot of work, but mostly reading through more ecl code to help
decide how to do things

I think I have a handle on how I'm going to do things, I have 4 stacks
for function arguments, saving special bindings,function calls and
frames for jumps/errors/etc. A lexical environment is just an alist,
rather than having an enclosing field which points to the enclosing
environment I just push onto the alist when I have a new lexical
environment and pop off the top bindings when I leave a lexical
environment, Meaning I need to keep track of how many new bindings are
introduced each time I add new lexical bindings, but ultimately it
should be much cleaner than before,

Rather that having an environment for function args I pass them on an
internal stack, then for a lambda I create the function lexical bindings
somewhat like:
sexp lambda_list=//the list of arguments to a function
while(consp(lambda_list)){
  symbol sym=pop(lambda_list);
  if(EQ(sym,(&optional or &key or &rest))){
    goto optional/key/rest;
  } else {
    push(lex_env,Cons(sym,pop(stack)))//pop rasises an error if empty
  }
}
optional:
  while(consp(lambda_list) && stack_ptr>=stack)
    push(lex_env,Cons(sym,pop(stack)));
  while(consp(lambad_list)
    push(lex_env,Cons(sym,nil))
...key...rest