procedure sexp(var x,y: scalar);
var
  i: integer;
  x1,s0,s1: scalar;
begin { sexp }
  if seq0(x) then y:=sone
  else begin
    x1:=x;
    sabs(x1,s0);
    ismult(136,s0);
    isdiv(hdim,s0);
    if s0.u.ex>0 then begin
      x1.u.ex:=x1.u.ex-1;
      x1.l.ex:=x1.l.ex-1;
      sexp(x1,s1);
      ispower(10000,s1,y);
    end
    else if s0.u.ex=0 then begin
      i:=1+s0.u.ma[0];
      isdiv(i,x1);
      sexp(x1,s1);
      ispower(i,s1,y);
    end
    else begin                      { |x| <= hdim/136 }
      irset(270,s0.l);
      irset(272,s0.u);
      isdiv(271,s0);
      for i:=2*hdim downto 1 do begin
        sprod(x1,s0,s1);
        isdiv(i,s1);
        ssum(sone,s1,s0);
      end;
      if hdim>(topint div 2) then writeln('sexp: error - hdim too large');
      y:=s0;
    end;
  end;
end { sexp };

