123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- MODULE VECT; % Vector support routines.
- % Authors: Mary Ann Moore and Arthur C. Norman.
- % Modified by: James H. Davenport.
- EXPORTS MKUNIQUEVECT,MKVEC,MKVECF2Q,MKIDENM,COPYVEC,VECSORT,SWAP,
- NON!-NULL!-VEC,MKVECT2;
- SYMBOLIC PROCEDURE MKUNIQUEVECT V;
- BEGIN SCALAR U,N;
- N:=UPBV V;
- FOR I:=0:N DO BEGIN
- SCALAR UU;
- UU:=GETV(V,I);
- IF NOT (UU MEMBER U)
- THEN U:=UU.U
- END;
- RETURN MKVEC U
- END;
- SYMBOLIC PROCEDURE MKVEC(L);
- BEGIN SCALAR V,I;
- V:=MKVECT(ISUB1 LENGTH L);
- I:=0;
- WHILE L DO <<PUTV(V,I,CAR L); I:=IADD1 I; L:=CDR L>>;
- RETURN V
- END;
- SYMBOLIC PROCEDURE MKVECF2Q(L);
- BEGIN
- SCALAR V,I,LL;
- V:=MKVECT(ISUB1 LENGTH L);
- I:=0;
- WHILE L DO <<
- LL:=CAR L;
- IF LL = 0 THEN LL:=NIL;
- PUTV(V,I,!*F2Q LL);
- I:=IADD1 I;
- L:=CDR L >>;
- RETURN V
- END;
- SYMBOLIC PROCEDURE MKIDENM N;
- BEGIN
- SCALAR ANS,U;
- SCALAR C0,C1;
- C0:=NIL ./ 1;
- C1:= 1 ./ 1;
- % constants.
- ANS:=MKVECT(N);
- FOR I:=0 STEP 1 UNTIL N DO <<
- U:=MKVECT N;
- FOR J:=0 STEP 1 UNTIL N DO
- IF I IEQUAL J
- THEN PUTV(U,J,C1)
- ELSE PUTV(U,J,C0);
- PUTV(ANS,I,U) >>;
- RETURN ANS
- END;
- SYMBOLIC PROCEDURE COPYVEC(V,N);
- BEGIN SCALAR NEW;
- NEW:=MKVECT(N);
- FOR I:=0:N DO PUTV(NEW,I,GETV(V,I));
- RETURN NEW
- END;
- SYMBOLIC PROCEDURE VECSORT(U,L);
- % Sorts vector v of numbers into decreasing order.
- % Performs same interchanges of all vectors in the list l.
- BEGIN
- SCALAR J,K,N,V,W;
- N:=UPBV U;% elements 0...n exist.
- % algorithm used is a bubble sort.
- FOR I:=1:N DO BEGIN
- V:=GETV(U,I);
- K:=I;
- LOOP:
- J:=K;
- K:=ISUB1 K;
- W:=GETV(U,K);
- IF V<=W
- THEN GOTO ORDERED;
- PUTV(U,K,V);
- PUTV(U,J,W);
- MAPC(L,FUNCTION (LAMBDA U;SWAP(U,J,K)));
- IF K>0
- THEN GOTO LOOP;
- ORDERED:
- END;
- RETURN NIL
- END;
- SYMBOLIC PROCEDURE SWAP(U,J,K);
- IF NULL U
- THEN NIL
- ELSE BEGIN
- SCALAR V;
- %swaps elements i,j of vector u.
- V:=GETV(U,J);
- PUTV(U,J,GETV(U,K));
- PUTV(U,K,V)
- END;
- SYMBOLIC PROCEDURE NON!-NULL!-VEC V;
- BEGIN
- SCALAR CNT;
- CNT := 0;
- FOR I:=0:UPBV V DO
- IF GETV(V,I)
- THEN CNT:=IADD1 CNT;
- RETURN CNT
- END;
- SYMBOLIC PROCEDURE MKVECT2(N,INITIAL);
- BEGIN
- SCALAR U;
- U:=MKVECT N;
- FOR I:=0:N DO
- PUTV(U,I,INITIAL);
- RETURN U
- END;
- ENDMODULE;
- END;
|