Значит, так. Насчет Lazarus'а ничего сказать не могу, а вот в Turbo и Free Pascal библиотеки создаются на базе модулей (Unit). Сам понаписал кучу библиотек, нужных для работы. В качестве примера могу привести модуль, расширяющий набор математических (и не только) функций языка:
Код:
unit Func;
interface
function RadGr(X:Extended):Extended;
function GrRad(X:Extended):Extended;
function Tan(X:Extended):Extended;
function ArcSin(X:Extended):Extended;
function ArcCos(X:Extended):Extended;
function Ch(X:Extended):Extended;
function Sh(X:Extended):Extended;
function Th(X:Extended):Extended;
function ArCh(X:Extended):Extended;
function ArSh(X:Extended):Extended;
function ArTh(X:Extended):Extended;
function Lg(X:Extended):Extended;
function X2Yp(X, Y:Extended):Extended;
function X2np(X:Extended; n:WORD):Extended;
function Int2Str(L:LongInt): string;
procedure Escape;
procedure Alg(X1,X2,X3,Y1,Y2,Y3,XA:Extended;VAR YA:Extended);
function Nfact(n:LongInt):Extended;
function NfactDBL(n:LongInt):Extended;
implementation
uses Crt;
function RadGr(X:Extended):Extended;
BEGIN
RadGr:=(X/Pi)*180;
END;
function GrRad(X:Extended):Extended;
BEGIN
GrRad:=(X/180)*Pi;
END;
function Tan(X:Extended):Extended;
BEGIN
Tan:=Sin(X)/Cos(X);
END;
function ArcSin(X:Extended):Extended;
BEGIN
IF ROUND(X*10000000)=10000000 THEN ArcSin:=Pi/2 ELSE
IF ROUND(X*10000000)=-10000000 THEN ArcSin:=-Pi/2 ELSE
ArcSin:=ArcTan(X/SQRT(1-X*X));
END;
function ArcCos(X:Extended):Extended;
BEGIN
IF ROUND(X*10000000)=10000000 THEN ArcCos:=0 ELSE
IF ROUND(X*10000000)=-10000000 THEN ArcCos:=Pi ELSE
ArcCos:=(Pi/2)-ArcTan(X/SQRT(1-X*X));
END;
function Ch(X:Extended):Extended;
BEGIN
Ch:=(Exp(X)+Exp(-X))/2;
END;
function Sh(X:Extended):Extended;
BEGIN
Sh:=(Exp(X)-Exp(-X))/2;
END;
function Th(X:Extended):Extended;
BEGIN
Th:=(Exp(X)-Exp(-X))/(Exp(X)+Exp(-X));
END;
function ArCh(X:Extended):Extended;
BEGIN
ArCh:=Ln(X+SQRT(X*X-1));
END;
function ArSh(X:Extended):Extended;
BEGIN
ArSh:=Ln(X+SQRT(X*X+1));
END;
function ArTh(X:Extended):Extended;
BEGIN
ArTh:=(1/2)*Ln((X+1)/(1-X));
END;
function Lg(X:Extended):Extended;
BEGIN
Lg:=Ln(X)/Ln(10);
END;
function X2Yp(X, Y:Extended):Extended;
BEGIN
X2Yp:=Exp(Y*Ln(X));
END;
function X2np(X:Extended; n:WORD):Extended;
Var i:WORD;
Y:Extended;
BEGIN
IF n=0 THEN X2np:=1 ELSE
IF n=1 THEN X2np:=X ELSE
BEGIN
Y:=X;
FOR i:=2 TO n DO Y:=Y*X;
X2np:=Y;
END;
END;
function Int2Str(L : LongInt) : string;
var
S : string;
begin
Str(L, S);
Int2Str := S;
end; { Int2Str }
procedure Escape;
VAR
Chr : char;
BEGIN
IF KeyPressed THEN
BEGIN
Chr :=ReadKey;
if Chr = #0 then chr := readkey;
if Chr = #27 then Halt(0);
END;
END; { Escape }
procedure Alg(X1,X2,X3,Y1,Y2,Y3,XA:Extended;VAR YA:Extended);
VAR
det, AA, BA, CA:Extended;
begin
det:=(X1-X2)*(X2-X3)*(X1-X3);
AA:=(Y1*(X2-X3)+Y2*(X3-X1)+Y3*(X1-X2))/det;
BA:=(Y1*(X3*X3-X2*X2)+Y2*(X1*X1-X3*X3)+Y3*(X2*X2-X1*X1))/det;
CA:=(Y1*X2*X3*(X2-X3)+Y2*X1*X3*(X3-X1)+Y3*X1*X2*(X1-X2))/det;
YA:=AA*XA*XA+BA*XA+CA;
end; { Alg }
function Nfact(n:LongInt):Extended;
VAR
i:LongInt;
fact:Extended;
BEGIN
IF n=0 THEN fact:=1 ELSE
BEGIN
fact:=1;
FOR i:=1 TO n DO
fact:=fact*i;
END;
Nfact:=fact;
END;
function NfactDBL(n:LongInt):Extended;
VAR
i:LongInt;
fact:Extended;
BEGIN
fact:=1;
i:=n;
REPEAT
fact:=fact*i;
DEC(i, 2);
UNTIL i<=1;
NfactDBL:=fact;
END;
END.