lang/dynamo/1.8.7/src/dyn.vec

Raw file
Back to index

PACKET vector DEFINES TAB, :=, vector,         (* Autor : H.Indenbirken *)
                      SUB, LENGTH, laenge, norm,  (* Stand : 24.09.81      *)
                      nilvector, replace, =, <>, wert,
                      +, -, *, /,
                      get, put :
 
LET n = 4000;
 
TYPE TAB = STRUCT (INT lng, TEXT elem);
TYPE INITTAB = STRUCT (INT lng, REAL value);
 
INT VAR i;
TEXT VAR t :: "12345678";
TAB VAR v :: nilvector;
 
 
REAL PROC wert (TAB CONST t, INT CONST i) :
 t SUB i
END PROC wert;
 
OP := (TAB VAR l, TAB CONST r) :
  l.lng := r.lng;
  l.elem := r.elem
 
END OP :=;
 
OP := (TAB VAR l, INITTAB CONST r) :
  l.lng := r.lng;
  replace (t, 1, r.value);
  l.elem := r.lng * t
 
END OP :=;
 
INITTAB PROC nilvector :
   vector (1, 0.0)
 
END PROC nilvector;
 
INITTAB PROC vector (INT CONST lng, REAL CONST value) :
  IF lng <= 0
  THEN errorstop ("PROC vector : lng <= 0") FI;
  INITTAB : (lng, value)
 
END PROC vector;
 
INITTAB PROC vector (INT CONST lng) :
  vector (lng, 0.0)
 
END PROC vector;
 
REAL OP SUB (TAB CONST v, INT CONST i) :
  test ("REAL OP SUB : ", v, i);
  v.elem RSUB i
 
END OP SUB;
 
INT OP LENGTH (TAB CONST v) :
  v.lng
 
END OP LENGTH;
 
INT PROC laenge (TAB CONST v) :
  v.lng
 
END PROC laenge;
 
REAL PROC norm (TAB CONST v) :
  REAL VAR result :: 0.0;
  FOR i FROM 1 UPTO v.lng
  REP result INCR ((v.elem RSUB i)**2) PER;
  sqrt (result)  .
 
END PROC norm;
 
PROC replace (TAB VAR v, INT CONST i, REAL CONST r) :
  test ("PROC replace : ", v, i);
  replace (v.elem, i, r)
 
END PROC replace;
 
BOOL OP = (TAB CONST l, r) :
  l.elem = r.elem
END OP =;
 
BOOL OP <> (TAB CONST l, r) :
  l.elem <> r.elem
END OP <>;
 
TAB OP + (TAB CONST v) :
  v
END OP +;
 
TAB OP + (TAB CONST l, r) :
  test ("TAB OP + : ", l, r);
  v := l;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, (l.elem RSUB i) + (r.elem RSUB i)) PER;
  v
 
END OP +;
 
TAB OP - (TAB CONST a) :
  v := a;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, - (a.elem RSUB i)) PER;
  v
 
END OP -;
 
TAB OP - (TAB CONST l, r) :
  test ("TAB OP - : ", l, r);
  v := l;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, (l.elem RSUB i) - (r.elem RSUB i)) PER;
  v
END OP -;
 
REAL OP * (TAB CONST l, r) :
  test ("REAL OP * : ", l, r);
  REAL VAR x :: 0.0;
  FOR i FROM 1 UPTO l.lng
  REP x INCR ((l.elem RSUB i) * (r.elem RSUB i)) PER;
  x
 
END OP *;
 
TAB OP * (TAB CONST v, REAL CONST r) :
  r*v
 
END OP *;
 
TAB OP * (REAL CONST r, TAB CONST a) :
  v := a;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, r*(a.elem RSUB i)) PER;
  v
 
END OP *;
 
TAB OP / (TAB CONST a, REAL CONST r) :
  v := a;
  FOR i FROM 1 UPTO v.lng
  REP replace (v.elem, i, (a.elem RSUB i)/r) PER;
  v
 
END OP /;
 
TEXT VAR error :: "";
PROC test (TEXT CONST proc, TAB CONST v, INT CONST i) :
  IF i > v.lng
  THEN error := proc;
       error CAT "subscript overflow (LENGTH v=";
       error CAT text (v.lng);
       error CAT ", i=";
       error CAT text (i);
       error CAT ")";
       errorstop (error)
  ELIF i < 1
  THEN error := proc;
       error CAT "subscript underflow (i = ";
       error CAT text (i);
       error CAT ")";
       errorstop (error)
  FI  .
 
END PROC test;
 
PROC test (TEXT CONST proc, TAB CONST a, b) :
  IF a.lng <> b.lng
  THEN error := proc;
       error CAT "LENGTH a (";
       IF a.lng <= 0
       THEN error CAT "undefined"
       ELSE error CAT text (a.lng) FI;
       error CAT ") <> LENGTH b (";
       error CAT text (b.lng);
       error CAT ")";
       errorstop (error)
  FI
 
END PROC test;
 
PROC get (TAB VAR v, INT CONST lng) :
  v.lng := lng;
  v.elem := lng * "12345678";
  REAL VAR x;
  FOR i FROM 1 UPTO lng
  REP get (x);
      replace (v.elem, i, x)
  PER  .
 
END PROC get;
 
PROC put (TAB CONST v, INT CONST laenge, fracs) :
  FOR i FROM 1 UPTO v.lng
  REP put (text (v.elem RSUB i, laenge, fracs)) PER
 
END PROC put;
 
PROC put (TAB CONST v) :
  FOR i FROM 1 UPTO v.lng
  REP put (text (v.elem RSUB i)) PER
 
END PROC put;
 
END PACKET vector;