expr_to_seq:=proc(expr::anything) 
  expr_to_seq_aux([],expr) 
end: # expr_to_seq
expr_to_seq_aux:=proc(path,expr)
  local i,n;
  if type(expr,{name,integer}) 
  then [path,expr]               
  else 
    n:=nops(expr);    
    [path,op(0,expr)],
      seq(expr_to_seq_aux([op(path),i],op(i,expr)),i=1..n) 
  fi 
end: # expr_to_seq_aux

maple_to_lisp:=proc(expr::anything)
  local i;
  if type(expr,{name,integer}) then expr
  else [op(0,expr),seq(maple_to_lisp(op(i,expr)),i=1..nops(expr))]
  fi
end: # maple_to_lisp

better_maple_to_lisp:=proc(expr::anything)
  local i;
  if [args]=[] then 
    better_maple_to_lisp(convert('NULL',string))
  elif type(expr,{name,integer}) then expr
  else [op(0,expr),
        seq(better_maple_to_lisp(op(i,expr)),
            i=1..nops(expr))]
  fi
end: # better_maple_to_lisp

B:=array(1..2,1..2,[[a,b],[c,d]]);
expr_to_seq(eval(B));
maple_to_lisp(eval(B));
better_maple_to_lisp(eval(B));

f:=proc(x) x+1 end:
expr_to_seq(f);
expr_to_seq(eval(f));
maple_to_lisp(eval(f));
better_maple_to_lisp(eval(f));

g:=proc(n::posint) 
    option remember;
    if n=0 then 1 else n*g(n-1) fi 
  end: # g
expr_to_seq(eval(g));
maple_to_lisp(eval(g));
better_maple_to_lisp(eval(g));

h:=proc(L::list(numeric))
    local i;
    global x;
    option remember;
    description `exemple`;
    map(proc(z) z+x end,L)
  end: # h
expr_to_seq(eval(h));
better_maple_to_lisp(eval(h));