{$mode objFPC} generic procedure sort(var X, Y: T); procedure swap; var Z: T; begin Z := X; X := Y; Y := Z end; begin if X > Y then begin swap end end; generic procedure sort(var X, Y, Z: T); begin specialize sort(X, Y); specialize sort(X, Z); specialize sort(Y, Z) end; generic procedure print(const X, Y, Z: T); begin writeLn('X = ', X); writeLn('Y = ', Y); writeLn('Z = ', Z) end; { === MAIN ============================================================= } var A, B, C: string; I, J, K: integer; P, Q, R: real; begin A := 'lions, tigers, and'; B := 'bears, oh my!'; C := '(from the "Wizard of OZ")'; specialize sort(A, B, C); specialize print(A, B, C); writeLn; I := 77444; J := -12; K := 0; specialize sort(I, J, K); specialize print(I, J, K); writeLn; P := 12.34; Q := -56.78; R := 9.01; specialize sort(P, Q, R); specialize print(P, Q, R) end.